Go指南-结构体与指针
2011 年 1 月 4 日
指针其实跟变量一样,只不过普通变量存放的是数值,而指针变量存放的是数值的内存地址。
其中 &
符号表示对变量取地址,得到一个指针; *
符号有 两种用法 ,如果 *
后面跟的是指针,则表示对指针取值,即得到指针指向的值;如果如果 *
后面跟的是类型,则表示一个指向该类型的 指针 。
Go文档的一个栗子:
func main() { i := 42 // 初始化一个值 p := &i // &i表示对变量i取地址,并把地址赋给p,所以p是一个指针,指向i的值 fmt.Println("pointer", p) // pointer 0xc000020078 fmt.Println("value", *p) // *表示对指针取值,即得到p指向的值,为42 *p = 21 // 通过指针赋值 fmt.Println(i) // 21 var k *int // 这里的k是一个指针!!! } 复制代码
注:Golang的指针不能进行计算。指针计算其实就是指针加减,在C语言中,是允许这样操作的,比如我们知道c语言中的数组名其实就是该数组的首地址,通过下标取值其实就是首地址的偏移,即加减。
结构体
Golang 里面的结构体(struct)可以类比面对对象语言中的类。
就像类有类方法一样,Golang也有结构体方法, 并且有带指针和不带指针的类方法。它们的区别具体如下:
type Rectangle struct { width int height int } func (r Rectangle) setWidth() { r.width = 100 } func (r *Rectangle) setHeight() { r.height = 100 } func main() { rec := Rectangle{width: 1, height: 1} rec.setWidth() fmt.Println(rec.width) // 仍然是1 rec.setHeight() fmt.Println(rec.height) // 变为100 } 复制代码
通过上面的例子可以看到,不带指针的方法(setWidth),传递的参数r其实是Rectangle的一份拷贝,所以即使在方法里面修改了width的值,原有的结构体并不受影响;而带指针的方法则相反。
官方文档也提到了这两者的区别:
Rectangle Rectangle
欢迎关注我们的微信公众号,每天学习Go知识