Go 指针的使用
指针也是一种类型,也可以创建变量,称为指针变量。指针变量类型为 *Type,该指针指向一个Type类型的变量,指针变量最大的一个特点就是存储某个实际变量的内存地址,通过记录某个变量的地址,从而间接操作该变量
创建指针
-
通过普通定义变量获取指针
func pointer() { x := 100 y := &x fmt.Println("x=", x) fmt.Println("*y=", *y) fmt.Println("&x=", &x) fmt.Println("y=", y) /** x= 100 *y= 100 &x= 0xc000018098 y= 0xc000018098 */ //&:可以从一个变量中取得内存地址 //*:赋值的左边,指该指针指向的变量,赋值的右边指:指针变量中取得的变量值(解引用) }
-
new 先创建指针并分配好内存,再给指针写入值
pointer1 := new(string) *pointer1 = "大西米从" fmt.Println(pointer1) //0xc000088220 fmt.Println(*pointer1)//大西米从
-
先声明一个指针变量,再从其他变量获取内存地址指针变量
x3 := "乐园支架" var p *string p = &x3 fmt.Println(p)//0xc00004e270
-
如果指针声明后没有进行初始化,其默认值为nil
var prt *string fmt.Println(prt)//nil
-
在函数中对指针所做的修改,在函数返回后会保存相应的修改
func change(value *int) { *value = 7 } func changeTest() { x := 99 prt := &x fmt.Println("改变值之前:x=", *prt)//99 change(prt) fmt.Println("改变值之后:x=", *prt)//7 //函数传入的是指针参数,即为内存地址,所以在函数内的修改是在内存地址的修改,在函数执行之后还会保存结果 }
-
切片与指针一样是引用类型,如果我们通过一个函数改变一个数值,可以将该数组的切片作为参数传递给函数,也可以将这个数组的指针作为参数传递给函数,但是Go中建议使用第一种方法,即是将数组的切片作为参数传递给函数,因为这样编写简单易读
//使用切片 func chaneSlice(value []int) { value[0] = 34 } //使用数组 func chaneArray(value *[3]int) { value[0] = 38 } func changeTest() { x := [3]int{90, 80, 56} chaneSlice(x[:]) fmt.Println("切片传参:x=", x) y := [3]int{900, 800, 560} chaneArray(&y) fmt.Println("数组传参:y=", y) /** 切片传参:x= [34 80 56] 数组传参:y= [38 800 560] */ }
-
Go中不支持指针运算(如:p++)