【GO基础】GO基础语法一

GO基础语法一

  • 一、编写第一个Go程序
      • 1、基本程序结构
      • 2、应用程序入口
      • 3、退出返回值
      • 4、获取命令行参数
  • 二、变量,常量以及与其他语言的差异
    • 1、编写测试程序
    • 2、实现Fibonacci数列
    • 3、变量赋值
    • 4、常量定义
  • 三、数据类型
    • 1、类型转化
    • 2、类型的预定义值
    • 3、指针类型
  • 四、运算符
    • 1、算数运算符
    • 2、比较运算符
    • 3、用==比较数组
    • 4、逻辑运算符
    • 5、位运算符
    • 五、循环
      • 1. 基本的 **for** 循环:
      • 2. **for range** 循环:
      • 3. **while** 条件循环:
      • 4. 无限循环:
      • 5.if条件
        • 1. 基本的 if 语句:
        • 2. if 语句的条件可以包含初始化语句:
        • 3.多个 if 语句的嵌套
      • 6.switch条件

一、编写第一个Go程序

1、基本程序结构

package main //包,表名代码所在的模块(包)import "fmt" //引入代码依赖//功能实现
func main(){fmt.Println("Hello,World!")}

2、应用程序入口

  1. 必须是main包 package main
  2. 必须是main方法 func main()
  3. 文件名不一定是main.go

3、退出返回值

与其他主要变成语言的差异

  • Go中的main函数不支持任何返回值

1702965849851.png

  • 通过os.Exit 来返回状态

1702965923247.png

4、获取命令行参数

与其他主要变成语言的差异

  • main函数不支持传入参数

    func main~~(arg []string)~~
    
  • 在程序中直接通过os.Args获取命令行参数

二、变量,常量以及与其他语言的差异

1、编写测试程序

  1. 源文件以_test结尾:xxx_test.go
  2. 测试方法以Test开头:func TestXXX(t *testing.T){}
package testimport ("log""testing"
)func TestFirstTry(T *testing.T){log.Print("My first try!")
}

1702973622467.png

2、实现Fibonacci数列

1,1,2,3,5,8,13,…

package fibimport ("testing"
)// TestFibList 是测试斐波那契数列生成函数的单元测试函数
func TestFibList(t *testing.T) {var a int = 1var b int = 1// 另一种变量声明方式:// var (//     a int = 1//     b     = 1// )// 或者使用短变量声明方式:// a := 1// b := 1// 输出变量 a 的值t.Log(a)// 循环生成斐波那契数列的前5个数并输出for i := 0; i < 5; i++ {// 输出变量 b 的值t.Log(b)// 交换 a 和 b 的值,生成下一个斐波那契数tmp := aa = bb = tmp + a}
}

1702974208052.png

3、变量赋值

与其他主要变成语言的差异

  • 赋值可以进行自动类型推断
  • 在一个赋值语句中可以对多个变量进行同时赋值
package fibimport ("testing"
)// TestExChange 是测试变量交换函数的单元测试函数
func TestExChange(t *testing.T) {// 初始化两个变量 a 和 b 的值a := 1b := 2//temp :=a  //a=b//b=temp// 使用短变量声明方式,同时交换 a 和 b 的值// 在 Go 中,可以通过这种方式轻松地实现两个变量的值交换a, b = b, a// 输出交换后的变量值t.Log(a, b)
}

输出结果:
1702974586987.png

4、常量定义

与其他主要变成语言的差异
快速设置连续值
iota枚举
Go里面有一个关键字iota,这个关键字用来声明enum的时候采用,它默认开始值是0,const中每增加一行加1:

package constan_testimport "testing"// 第一个常量组,使用 iota 枚举星期几
const (Monday    = iota + 1TuesdayWednesday
)// 第二个常量组,使用 iota 创建一组表示文件权限的常量
const (Readable  = 1 << iota // 位运算左移,表示可读Writable              // 位运算左移,表示可写Executable            // 位运算左移,表示可执行
)// TestConstanTry 是测试星期几常量的单元测试函数
func TestConstanTry(t *testing.T) {// 输出星期几的常量值t.Log("星期一:", Monday)t.Log("星期二:", Tuesday)t.Log("星期三:", Wednesday)
}// TestConstanTry1 是测试文件权限常量的单元测试函数
func TestConstanTry1(t *testing.T) {//a:=7 // 二进制表示为 0111 TRUE TRUE  TRUE a := 1 // 二进制表示为 0001 true false false// 使用位运算检查文件权限t.Log("可读:", a&Readable == Readable) t.Log("可写:", a&Writable == Writable)t.Log("可执行:", a&Executable == Executable)
}

三、数据类型

数据类型描述示例
int有符号整数类型,大小取决于计算机架构,常用于表示整数。var x int = 10
int8有符号8位整数类型,范围为-128到127。var x int8 = 127
int16有符号16位整数类型,范围为-32768到32767。var x int16 = -300
int32有符号32位整数类型,范围为-2147483648到2147483647。var x int32 = 100000
int64有符号64位整数类型,范围为-9223372036854775808到9223372036854775807。var x int64 = -9223372036854775808
uint无符号整数类型,大小取决于计算机架构,常用于表示正整数。var x uint = 10
uint8无符号8位整数类型,范围为0到255。var x uint8 = 255
uint16无符号16位整数类型,范围为0到65535。var x uint16 = 65535
uint32无符号32位整数类型,范围为0到4294967295。var x uint32 = 4294967295
uint64无符号64位整数类型,范围为0到18446744073709551615。var x uint64 = 18446744073709551615
float3232位浮点数类型,可表示小数。var x float32 = 3.14
float6464位浮点数类型,可表示小数。var x float64 = 3.14
complex64由两个32位浮点数表示的复数类型。var x complex64 = 3 + 4i
complex128由两个64位浮点数表示的复数类型。var x complex128 = 3 + 4i
byteuint8 的别名,常用于表示ASCII字符。var x byte = ‘A’
runeint32 的别名,常用于表示Unicode字符。var x rune = ‘你’
string字符串类型,表示一串字符。var x string = “Hello”
bool布尔类型,表示真或假。var x bool = true
array数组类型,固定大小的元素序列。var x [3]int = [3]int{1, 2, 3}
slice切片类型,可变大小的元素序列。var x []int = []int{1, 2, 3}
map映射类型,存储键值对的无序集合。var x map[string]int = map[string]int{“a”: 1, “b”: 2}
struct结构体类型,自定义的复合数据类型。type Person struct {Name string; Age int}

1、类型转化

与其他主要变成语言的差异

  1. Go语言不允许隐式类型转换
  2. 别名和原有类型也不能进行隐式类型转换

1702977014423.png

2、类型的预定义值

math 包提供了一些常用类型的预定义值,包括整数、浮点数等。以下是三个例子:

  1. math.MaxInt64
  2. math.MaxFloat64
  3. math.MaxUint32

package math_constantsimport ("fmt""math"
)func ExampleMaxInt64() {// 输出 int64 类型的最大值fmt.Printf("int64 类型的最大值:%d\n", math.MaxInt64)
}
func ExampleMaxFloat64() {// 输出 float64 类型的最大值fmt.Printf("float64 类型的最大值:%f\n", math.MaxFloat64)
}
func ExampleMaxUint32() {// 输出 uint32 类型的最大值fmt.Printf("uint32 类型的最大值:%d\n", math.MaxUint32)
}func main() {ExampleMaxInt64()ExampleMaxFloat64()ExampleMaxUint32()
}

这些预定义值对于处理数值边界和范围非常有用。

3、指针类型

与其他主要变成语言的差异

  1. 不支持指针运算

在 Go 语言中,指针的使用受到一些限制,其中最明显的一点是不支持指针运算。以下是一个简单的例子,说明了指针运算在 Go 中是不允许的:

package pointer_testimport "testing"// TestPointerArithmetic 是测试指针运算的单元测试函数
func TestPointerArithmetic(t *testing.T) {// 定义一个整数变量 x,并赋值为 10x := 10// 定义一个指向整数的指针变量 p,指向 x 的内存地址p := &x// 尝试进行指针运算(不允许的操作),这将导致编译错误// p = p + 1  // 这行代码会导致编译错误// 输出 x 的值和指针变量 p 的值t.Logf("x 的值:%d,指针变量 p 的值:%p", x, p)
}

在这个例子中,尝试进行指针运算 p = p + 1 会导致编译错误,因为在 Go 中不允许直接对指针进行加法或减法运算。

  1. string是值类型,其默认的初始化值为空字符串,而不是null

在 Go 中,string 是一种特殊的值类型,它代表不可变的字符序列。string 的默认初始化值是空字符串而不是 null。以下是一个示例:

package string_testimport "testing"// TestStringInitialization 是测试 string 初始化的单元测试函数
func TestStringInitialization(t *testing.T) {// 声明一个字符串变量 s,其默认初始化值为空字符串var s string// 输出字符串变量 s 的值t.Logf("字符串变量 s 的值:%q", s)
}

在这个例子中,s 是一个字符串变量,由于没有显式赋值,它的默认初始化值是空字符串。通过 %q 格式化符输出字符串时,如果字符串为空,会显示为空字符串而不是 null

四、运算符

1、算数运算符

运算符描述示例
+加法a + b
-减法a - b
*乘法a * b
/除法a / b
%求余a % b
++自增a++++a
自减a––a

Go语言没有前置的++,–(++a)

以下是一个使用算术运算符的简单示例:

package arithmetic_operatorsimport "fmt"func main() {// 定义两个整数变量a := 10b := 5// 加法sum := a + bfmt.Printf("加法结果:%d\n", sum)// 减法difference := a - bfmt.Printf("减法结果:%d\n", difference)// 乘法product := a * bfmt.Printf("乘法结果:%d\n", product)// 除法quotient := a / bfmt.Printf("除法结果:%d\n", quotient)// 求余remainder := a % bfmt.Printf("求余结果:%d\n", remainder)// 自增a++fmt.Printf("自增后的值:%d\n", a)// 自减b--fmt.Printf("自减后的值:%d\n", b)
}

2、比较运算符

运算符描述示例
==相等a == b
!=不相等a != b
<小于a < b
>大于a > b
<=小于等于a <= b
>=大于等于a >= b
package comparison_operatorsimport "fmt"func main() {// 定义两个整数变量a := 10b := 5// 相等equal := a == bfmt.Printf("相等:%t\n", equal)// 不相等notEqual := a != bfmt.Printf("不相等:%t\n", notEqual)// 小于lessThan := a < bfmt.Printf("小于:%t\n", lessThan)// 大于greaterThan := a > bfmt.Printf("大于:%t\n", greaterThan)// 小于等于lessThanOrEqual := a <= bfmt.Printf("小于等于:%t\n", lessThanOrEqual)// 大于等于greaterThanOrEqual := a >= bfmt.Printf("大于等于:%t\n", greaterThanOrEqual)
}

3、用==比较数组

  • 数组的维数必须相同。
  • 数组中元素的个数必须相同。
  • 数组中的每个元素都必须相等。
package testimport ("fmt""testing"
)func TestArrayComparison(t *testing.T) {// 定义两个数组array1 := [3]int{1, 2, 3}array2 := [3]int{1, 2, 3}array3 := [3]int{4, 5, 6}// 使用 == 比较数组equal1 := array1 == array2equal2 := array1 == array3// 输出比较结果fmt.Printf("array1 是否等于 array2:%t\n", equal1)fmt.Printf("array1 是否等于 array3:%t\n", equal2)
}

4、逻辑运算符

运算符描述示例
&&逻辑与a && b
||逻辑或a || b
!逻辑非!a
func TestLogical(t *testing.T) {// 定义两个布尔变量isTrue := trueisFalse := false// 逻辑与andResult := isTrue && isFalsefmt.Printf("逻辑与结果:%t\n", andResult)// 逻辑或orResult := isTrue || isFalsefmt.Printf("逻辑或结果:%t\n", orResult)// 逻辑非notResult := !isTruefmt.Printf("逻辑非结果:%t\n", notResult)
}

5、位运算符

运算符描述示例
&位与a & b
|位或a | b
^位异或a ^ b
<<左移a << b
>>右移a >> b
&^位清空 (AND NOT)a &^ b
func TestBitwiseOperators(t *testing.T) {// 定义两个整数变量a := 5    // 二进制: 0101b := 3    // 二进制: 0011// 位与andResult := a & bfmt.Printf("位与结果:%d\n", andResult) // 0001 (1)// 位或orResult := a | bfmt.Printf("位或结果:%d\n", orResult) // 0111 (7)// 位异或xorResult := a ^ bfmt.Printf("位异或结果:%d\n", xorResult) // 0110 (6)// 左移leftShiftResult := a << 1fmt.Printf("左移结果:%d\n", leftShiftResult) // 1010 (10)// 右移rightShiftResult := a >> 1fmt.Printf("右移结果:%d\n", rightShiftResult) // 0010 (2)// 位清空 (AND NOT)clearResult := a &^ bfmt.Printf("位清空结果:%d\n", clearResult) // 0100 (4)
}

与其他主要变成语言的差异

  • ** **&^按位置零

该操作符的使用方式是 a &^ b,它的作用是将 b 中为 1 的位在 a 中对应位置上清零。

func TestBitwiseClear(t *testing.T) {// 定义两个整数变量a := 5    // 二进制: 0101b := 3    // 二进制: 0011// 使用 &^ 按位清零result := a &^ b// 输出结果fmt.Printf("a &^ b 按位清零结果:%d\n", result) // 0100 (4)
}

五、循环

与其他主要变成语言的差异
GO语言仅支持循环关键字for

1. 基本的 for 循环:

	// 基本的 for 循环for i := 1; i <= 5; i++ {fmt.Println(i)}

2. for range 循环:

func TestFor(t *testing.T) {// 使用 for range 遍历数组numbers := []int{1, 2, 3, 4, 5}for index, value := range numbers {fmt.Printf("索引:%d,值:%d\n", index, value)}// 使用 for range 遍历字符串message := "Hello, Go!"for index, char := range message {fmt.Printf("索引:%d,字符:%c\n", index, char)}
}

3. while 条件循环:

func TestFor01(t *testing.T) {// 模拟 while 循环counter := 1for counter <= 5 {fmt.Println(counter)counter++}
}

4. 无限循环:

func TestFor02(t *testing.T) {// 无限循环counter := 0for {fmt.Println("无限循环")counter++if counter == 3 {break // 终止循环}}
}

5.if条件

1. 基本的 if 语句:
// 基本的 if 语句
x := 10if x > 5 {fmt.Println("x 大于 5")
} else {fmt.Println("x 不大于 5")
}
2. if 语句的条件可以包含初始化语句:
// if 语句的条件包含初始化语句if x := 10; x > 5 {fmt.Println("x 大于 5")} else {fmt.Println("x 不大于 5")}

在这个例子中,if 语句的条件部分包含了初始化语句 x := 10,这个变量 x 只在 if 语句的作用域内有效。

3.多个 if 语句的嵌套
	// 多个 if 语句的嵌套x := 10if x > 5 {fmt.Println("x 大于 5")if x > 8 {fmt.Println("x 大于 8")}} else {fmt.Println("x 不大于 5")}

与其他主要变成语言的差异

  1. condition 表达式结果必须为布尔值

在 Go 语言中,条件表达式的结果必须是一个布尔值。这意味着 iffor 等语句中的条件表达式必须评估为布尔类型,不能接受非布尔类型的值

// Go 语言中的条件表达式必须是布尔值
if x > 5 {// ...
}// 错误示例,编译时将会报错
if x {// ...
}

在上述错误示例中,x 是一个变量,但它的类型不是布尔类型,因此这个条件表达式会导致编译错误。相比之下,一些其他语言可能允许使用非布尔类型的值作为条件。

  1. 支持变量赋值

6.switch条件

与其他主要变成语言的差异
1.条件表达式不限制为常量或者整数;

func TestSwitch(t *testing.T) {var x interface{} = "hello"switch x.(type) {case int:fmt.Println("x 是一个整数")case string:fmt.Println("x 是一个字符串")default:fmt.Println("未知类型")}}

switch 语句的条件表达式可以是任意类型,不限制为常量或整数。这使得 switch 可以用于更复杂的条件判断,例如字符串、接口等类型。

2.单个 case 中,可以出现多个结果选项,使用逗号分隔;

func TestSwitch2(t *testing.T) {num := 2switch num {case 1, 2:fmt.Println("数字是1或2")case 3:fmt.Println("数字是3")default:fmt.Println("未知数字")}}

3.与C语言等规则相反,Go 语言不需要用break来明确退出一个 case;

func TestSwitch3(t *testing.T) {day := "Monday"switch day {case "Monday":fmt.Println("星期一")case "Tuesday":fmt.Println("星期二")default:fmt.Println("其他日子")}
}

4.可以不设定switch 之后的条件表达式,在此种情况下,整个 switch 结构与多个 if…else…的逻辑作用等同

func TestSwitch4(t *testing.T) {num := 2switch {case num > 5:fmt.Println("数字大于5")case num > 0:fmt.Println("数字大于0")default:fmt.Println("未知数字")}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序仿胖东来轮播和背景效果(有效果图)

效果图 .wxml <view class"swiper-index" style"--width--:{{windowWidth}}px;"><image src"{{swiperList[(cardCur bgIndex -1?swiperList.length - 1:cardCur bgIndex > swiperList.length -1?0:cardCur bgIndex)]}}" clas…

【四数之和】python,排序+双指针

四层循环&#xff1f;&#xff08;doge) 和【三数之和】题目很类似 class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:nums.sort()#a,b,c,d四个数&#xff0c;先固定两个数&#xff0c;那就是双指针问题了&#xff0c;令ba1&#xff…

关于搜索引擎链路

一、搜索引擎的的链路 简单流程如下&#xff0c;一般都包括query理解&#xff0c;召回&#xff0c;粗排&#xff0c;精排&#xff0c;重排。 二、query理解&#xff0c;查询词处理 对于进来的query需要有很多道工序做处理。才能让搜索引擎的效果更好、更智能。 2.1 分词 分词…

Ubuntu18.04 OpenSSH升级

升级前版本&#xff1a; rootecs-m2eqyb:/opt# ll total 20912 drwxr-xr-x 2 root root 4096 May 10 16:23 ./ drwxr-xr-x 24 root root 4096 May 10 14:38 ../ -rw-r--r-- 1 root root 1848766 May 10 16:23 openssh-9.7p1.tar.gz -rw-r--r-- 1 root root 18038…

离散数学--图论

目录 1.简单概念 2.握手定理 3.点割集 4.边割集 5.点连通度和边连通度 6.Dijstra算法&&最短路径 7.有向图的连通性 8.图的矩阵表示 9.欧拉图问题 10.哈密尔顿图 1.简单概念 &#xff08;1&#xff09;这个里面的完全图比较重要&#xff0c;完全图是例如k3,k5这…

JMETER工具:以录制手机app为例

JMETER工具&#xff1a;以录制手机app为例子 JMETER安装和环境配置 pc需要安装jdk&#xff0c;并进行jdk的环境配置&#xff0c;安装好jdk并配置好后&#xff0c;通过命令行输入java –version出现以下界面就表示安装成功&#xff1a; &#xff08;对应的jdk版本不可太低&…

selenium环境安装和web自动化基础

webUI自动化背景 因为web页面经常会变化&#xff0c;所以UI自动化测试的维护成本很高。不如接口的适用面广&#xff0c;所以大部分公司会做接口自动化测试&#xff0c;但是未必会做UI自动化测试&#xff1b; UI自动化测试要做也是覆盖冒烟测试&#xff0c;不会到很高的覆盖率&a…

Flink常见面试题总结

文章目录 1. 简单介绍一下Flink2. Flink 的运行必须依赖Hadoop组件吗?3. Flink 和 Spark Streaming 的区别&#xff1f;4. Flink集群角色5. Flink核心概念5.1 并行度5.2 算子链&#xff08;Operator Chain&#xff09;5.3 任务槽&#xff08;Task Slots&#xff09;5.4 任务槽…

掌握Go语言中的net/http包:编写高性能Web服务

掌握Go语言中的net/http包&#xff1a;编写高性能Web服务 引言HTTP服务器构建基础服务器设置路由与处理函数中间件使用高级配置&#xff08;如TLS/SSL&#xff09; HTTP客户端开发创建与使用HTTP客户端处理响应 高级客户端特性 处理JSON与表单数据接收与解析JSON接收与解析表单…

实现一个自定义 hook,用于强制刷新当前组件

写在前面 在 react 中&#xff0c;如果 state 数据发生变化&#xff0c;我们知道&#xff0c;会重新渲染该组件。 但是这个前提是我们需要依赖 state 数据的变化&#xff0c;那比如我们并不想定义 state&#xff0c;又或者说我们的操作不能引起 state 的变化&#xff0c;此时…

无人机行业招投标技术详解

一、招标流程与原则 无人机行业的招投标流程通常包括招标公告发布、招标文件购买与审查、投标单位资格预审、投标书编制与递交、开标评标、中标公示与合同签订等步骤。在此过程中&#xff0c;必须遵循公开、公平、公正的原则&#xff0c;确保所有符合要求的投标单位都能获得平…

SpringBoot Bean

配置优先级 Bean的管理 从IOC容器中获取Bean对象&#xff1a;注入IOC容器对象 bean的作用域 Bean对象默认在容器启动时实例化 Lazy在第一次使用时初始化 Bean的管理&#xff1a;第三方Bean 引入依赖&#xff0c;每次解析创建新对象&#xff0c;浪费资源 将第三方对象交给…

如何搭建springBoot项目中的全局异常处理和自定义异常处理

目录 1 什么是异常 2 异常的种类 3 解决异常的方式 4 全局异常处理器和自定义异常处理器 5 测试异常处理 1 什么是异常 异常&#xff08;Exception&#xff09;是在程序执行过程中出现的一种特殊情况或错误。它可以是由于程序逻辑错误、运行环境问题、用户输入错误等原因…

【AI基础】反向传播

文章目录 1. 先写出第一步2.将其封装成函数3. pytorch版 1. 先写出第一步 # 定义输入值和期望输出 x_1 40.0 x_2 80.0 expected_output 60.0 初始化# 定义权重 w_1_11 0.5 w_1_12 0.5 w_1_13 0.5 w_1_21 0.5 w_1_22 0.5 w_1_23 0.5w_2_11 1.0 w_2_21 1.0 w_2_31 1…

基于 vLLM 搭建 DeepSeek-V2 Chat 服务

直奔主题。 安装vLLM 官方实现的代码还没有 merge 到 vLLM 主分支&#xff0c;所以直接 git clone DeepSeek 的分支。 git clone https://github.com/zwd003/vllm.git cd vllm pip install -e .源码安装大概耗时 10 分钟。 OpenAI 接口规范启动 官方 Github 放的是单条推理…

通过短信群发平台拓客引流营销的效果好不好?

通过短信群发平台进行营销拓客引流的效果可以是非常显著的&#xff0c;但具体效果会受到多种因素的影响&#xff0c;如目标受众的选择、短信内容的吸引力、发送时间和频率的合理性等。 以下是一些短信群发平台营销拓客引流的优势&#xff1a; 1.广泛覆盖&#xff1a;短…

噪声条件分数网络——NCSN原理解析

1、前言 本篇文章&#xff0c;我们讲NCSN&#xff0c;也就是噪声条件分数网络。这是宋飏老师在2019年提出的模型&#xff0c;思路与传统的生成模型大不相同&#xff0c;令人拍案叫绝&#xff01;&#xff01;&#xff01; 参考论文&#xff1a; ①Generative Modeling by Es…

cesium圆形扩散扫描效果封装

效果 封装类 优化了着色器代码&#xff1b;增加了边框大小调整参数&#xff0c;增加了清除效果方法 注&#xff1a;在页面销毁时需要调用清除方法 CircleDiffusion.clear()/*** circleDiffusion&#xff1a;圆扩散特效封装类**/// 圆扩散 class CircleDiffusion {viewer;last…

docker容器安装nexus3以及nexus3备份迁移仓库数据

一、安装步骤 1.搜索nexus3镜像 docker search nexus3 2.拉取镜像 docker pull sonatype/nexus3或者指定版本 docker pull sonatype/nexus3:3.68.0 3.查看拉取的镜像 docker images | grep "nexus3" 4.启动nexus服务 直接启动 docker run -d --name nexus3 -…

怎么查看公网IP?

在网络通信中&#xff0c;每个设备都会被分配一个IP地址&#xff0c;用于在互联网上进行唯一标识和通信。公网IP是指可以被公开访问的IP地址&#xff0c;可以用来建立远程连接或者进行网络访问等操作。怎么查看公网IP呢&#xff1f;下面将介绍几种常用的方法。 使用命令行查询公…