你好,GO 是类C语言,也就是面向过程语言。见此。
以C语言为例,它是没有类这种概念的,只有结构体。
在C中,编写一个结构体的方法,我们通常采用以下写法:
void func(s *Student,id int){
...
}
把第一个参数做为该方法的“类对象”,也称为接受者,receiver。
而Go只是把C语言中的第一个参数放到方法前面而已,所以它并不是用来类型转换的,而是一个接收者,说明该方法属于哪个结构体。
你有可能会好奇接收器该不该加星号?
也就是方法的接收器什么时候适合是指向结构体的指针而不是结构体值。
你可以点击之前的链接,官方文档里说得很详细了。我这里简单概括下,还是以C语言为例,我们知道在C中如果对一个指针变量进行修改,那么它的“副本”们也都会被修改。
所以在Go中,
- 如果你的方法是需要对结构体本身修改的,请使用指针作为接收器。否则,以值为接收器,改动将无效(类似slice,map特殊结构体)。
- 你的结构体很大,用一个指针传递,会节约资源。
- 为统一起见,如果你的大多方法以指针为接收器,请把其他方法也优先以指针作为接收器,不然调用时可能会提示该方法不属于某结构体的乌龙错误。