type Point struct { x,y int }
func main(){
p:=&Point{2,4}
p.double()//可以
(*p).double()//可以
(&Point{2,4}).double()//可以
(Point{2,4}).double()//报错
}
func (p *Point)double()int{ return p.x+p.y }
编译报错无法获得Point类型字面量的地址。 不明白为什么手动加了&就可以了呢?我看教程上面的解释是无法获取临时变量的地址。 但&不就是取地址操作吗?为什么对Point类型字面量手动取地址就可以调用它的方法呢?
有疑问加站长微信联系(非本文作者)

1、类型T的可调用方法集包含接受者为T或T的所有方法集 2、类型T的可调用方法集包含接受者为T的所有方法 3、类型T的可调用方法集不包含接受者为*T的方法
通俗的说就是,如果方法的接受者是指针(比如你这个方法),只能用指针调用,指针者是实体的话,指针和实体都能调用此方法。 我也是新手,这是我个人看的一些资料后的理解。
建议新人看看这个:https://cloud.tencent.com/developer/doc/1101 刚入门不用太着急,建议教程多看几遍,然后跟着教程一遍自己动手写写
Point{2,4}
是一个 struct literal,一个临时数据,不是一个变量,也就是说不能获取这个量的地址(只能获取变量的地址),按理说&Point{2,4}
是会出错的。但是用 struct literal 初始化一个数据然后获取它的指针是一个非常常用的操作,因此 Go 提供了这样一个语法糖:&Point{2,4}
,相当于:Go语言程序设计这本书有讲到这个。
《Go程序设计语言》,不是《Go语言程序设计》。
```package main
import ( "log" )
type ( A struct { a string } )
func (self A) SetA(a string) { self.a = a }
func (self *A) SetAR(a string) { self.a = a }
func main() { a := A{a: "hello"} a.SetA("Noooooo!") a.SetAR("No!")
}```
这MD的格式解释得好感人!
感谢大佬,原来是个语法糖,你一说我就懂了,非常感谢