一。定义:
数据类型前加 * 号: var xx *int var yy *string 。。。
二。用途:
指针的一大用途就是可以将变量的指针作为实参传递给函数,从而在函数内部能够直接修改实参所指向的变量值
三。用法:
& 取一个变量的地址
* 取一个指针变量所指向的地址的值
四。new函数:初始化了一个地址
package main import ( "fmt" ) func set_value(x_ptr *int) { *x_ptr = 100 } func main() { x_ptr := new(int) set_value(x_ptr) //x_ptr 指向的地址 fmt.Println(x_ptr) //x_ptr 本身的地址 fmt.Println(&x_ptr) //x_ptr 指向的地址值 fmt.Println(*x_ptr) }
五。go语言命令行入参,通过flag入参数。
Go 语言的 flag 包中,定义的指令以指针类型返回。通过学习 flag 包,可以深入了解指针变量在设计上的方便之处。
下面的代码通过提前定义一些命令行指令和对应变量,在运行时,输入对应参数的命令行参数后,经过 flag 包的解析后即可通过定义的变量获取命令行的数据。
获取命令行输入:
1 package main 2 // 导入系统包 3 import ( 4 "flag" 5 "fmt" 6 ) 7 // 定义命令行参数 8 var mode = flag.String("mode", "", "process mode") 9 func main() { 10 // 解析命令行参数 11 flag.Parse() 12 // 输出命令行参数 13 fmt.Println(*mode) 14 }
将这段代码命名为main.go,然后使用如下命令行运行:
$ go run flagparse.go --mode=fast
命令行输出结果如下:
fast
代码说明如下:
- 第 8 行,通过 flag.String,定义一个 mode 变量,这个变量的类型是 *string。后面 3 个参数分别如下:
- 参数名称:在给应用输入参数时,使用这个名称。
- 参数值的默认值:与 flag 所使用的函数创建变量类型对应,String 对应字符串、Int 对应整型、Bool 对应布尔型等。
- 参数说明:使用 -help 时,会出现在说明中。
- 第 11 行,解析命令行参数,并将结果写入创建的指令变量中,这个例子中就是 mode 变量。
- 第 13 行,打印 mode 指针所指向的变量。
由于之前使用 flag.String 已经注册了一个 mode 的命令行参数,flag 底层知道怎么解析命令行,并且将值赋给 mode*string 指针。在 Parse 调用完毕后,无须从 flag 获取值,而是通过自己注册的 mode 这个指针,获取到最终的值。代码运行流程如下图所示。
图:命令行参数与变量的关系