這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
golang中,struct的method的形式如下:
func (r ReceiverType) funcName(parameters) (results)
如果想要修改struct的成員的值,method被定義時候其ReceiverType必須是struct*形式。如果ReceiverType是struct,則無法改變struct成員的值。
廢話少說,代碼驗證:
[cpp] view plaincopy
package main
import (
"fmt"
)
type tag struct {
value int32
}
func (_tag tag) Change() {
_tag.value = int32(987)
}
type tag2 struct {
value int32
}
func (_tag *tag2) Change2() {
_tag.value = int32(987)
}
func main() {
_tag := new(tag)
_tag.value = 123
_tag.Change()
fmt.Println(_tag)
_tag.Change()
fmt.Println(_tag)
_tag2 := tag2{41}
_tag2.Change2()
fmt.Println(_tag2)
_tag2.Change2()
fmt.Println(_tag2)
}
上面main函數中,第一段代碼中對象_tag的形式為*tag,但是其方法Change無法改變其value值。第二段代碼中對象_tag的形式為*ag,但是其方法Change卻可以改變其value值。
如果有人感興趣,我就接著給說道說道。
golang中的method的第一個參數就是它的ReceiverType,而c++以及其同類語言java等C系語言中method的方法預設是class* this。也就是說,golang中method有傳對象值與傳對象地址的值兩種,而C系語言強制要求傳遞對象的地址。
這麼說,就可以理解了吧?