指针类型比较常见
type Dog struct { name string } func (dog *Dog) SetName (name string){ dog.name = name }
对于基本类型Dog来说,*Dog就是它的指针类型。&dog就是d值不为nil的dog变量的指针值。如果一个方法的接收者是*Dog类型,那么该方法就是基本类型Dog的一个指针方法,在这种情况下,方法接收者实际上就是当前基本值的指针值,可以他通过指针值访问到基本值包含的任何字段以及调用与之关联的任何方法。
传统意义上来说,指针式指向某个确切的内存地址的值。Go语言中还有其他几样东西可以代表指针,其中最贴近传统意义的是uintptr类型。unsafe.Pointer可以表示任何指向可寻址的值的指针。同时也是前面提到的指针值和uintptr值之间的桥梁,通过它可以在这两种值之上进行双向的转换
1、前面有个关键词,可寻址,那哪些值是不可寻址的呢?
1)不可变的值会被存储到一个确切的内存区域
如:常量、基本类型字面量、字符串值、基于字符串的索引或切片的结果值
2)临时结果,可以把各种对值字面量施加的表达式的求值结果都看作是临时结果
如:算术操作的结果值,针对值字面量的表达式的结果值、类型转换表达式结果值,类型断言表达式结果值、对函数或方法的调用结果值
有一例外:对切片字面量的索引结果值可寻址
如果把临时结果赋给一个变量,那么它就是可寻址的了。
3)不安全的,破坏程序一致性
如:字典变量的索引结果值的取址操,获取由字面量或标识符代表的函数或方法的地址
2、不可寻址的值在使用上有哪些限制?
首先是无法使用取址操作符&获取它们的指针
func New (name string ) Dog { return Dog{name} } New("little pig").SetName("monster")
上面的代码可以执行成功吗?
对一个Dog类型的变量dog来说,调用表达式dog.SetName("monster")会被自动转译为(&dog).SetName("monster"),即:先取dog的指针值,再在该指针值上调用SetName方法。但是New函数所得的结果值属于临时结果,是不可寻址的,因此会报错。
Go语言中++或--的左边表达式的结果值必须是可寻址的。