package main import "fmt" type Person struct { name string sex byte age int } //帶有接收者的函數叫方法 func (tmp Person) PrintInfo() { fmt.Println("person = ", tmp) } func (tmp *Person) SetInfo(n string, s byte, a int) { tmp.name = n tmp.sex = s tmp.age = a fmt.Println("set info = ", *tmp) } func main() { p := Person{"baylor", 'm', 18} p.PrintInfo() var s Person (&s).SetInfo("mike", 'f', 18) s.PrintInfo() }
執行結果
person = {baylor 109 18} set info = {mike 102 18} person = {mike 102 18}
這里不太好懂,記 一下我個人的理解,對於這種
func (tmp *Person) SetInfo(n string, s byte, a int)
我覺得相當於為結構體person綁定了一個setinfo或者printinfo的方法,如果有變量做了person的初始化,那么這個變量就有這些函數的屬性
比如p為結構體person的初始化,那么就可以執行p.printinfo的函數,因為結構體類似於數組如果需要變更里面的元素需要使用地址進行引用
所以s初始化的方式才可以進行元素的變更
其實在GO語言中,可以為任何自定義類型(包括內置類型,但不包括指針類型)添加相應的方法
func (receiver receivertype) funcname(parameters) results
如果有兩個方法是同名,只要接收者的類型不一樣,那么GO語言也就認為這兩個是不同的方法
其次就是receivertype本身不可以是指針類型