用實例value與pointer調用方法(含匿名字段)不受方法集的約束,編譯器總是查找全部方法,並且自動轉換receiver實參
package main
import "fmt"
type Person struct {
name string //名字
sex byte //性別, 字符類型
age int //年齡
}
//非指針
func (p Person) SetInfoValue() {
fmt.Println("SetInfoValue")
}
//指針
func (p *Person) SetInfoPointer() {
fmt.Println("SetInfoPointer")
}
func main() {
//結構體變量是一個指針變量,它能夠調用哪些方法,這些方法就是一個集合,簡稱方法集
p := &Person{"mike", 'm', 18}
p.SetInfoPointer() //func (p *Person) SetInfoPointer()
(*p).SetInfoPointer() //把(*p)轉換層p後再調用,等價於上面
//內部做的轉換, 先把指針p, 轉成*p後再調用
(*p).SetInfoValue()
p.SetInfoValue()
//普通變量
p1 := Person{"mike", 'm', 18}
p1.SetInfoPointer() //func (p *Person) SetInfoPointer()
//內部,先把p, 轉爲爲&p再調用,
(&p1).SetInfoPointer()
p.SetInfoValue()
}
結果:
GOROOT=E:\software\Go #gosetup
GOPATH=E:\software\Go\GOPATH #gosetup
E:\software\Go\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\___go_build_study_gin.exe study_gin #gosetup
C:\Users\Administrator\AppData\Local\Temp\___go_build_study_gin.exe #gosetup
SetInfoPointer
SetInfoPointer
SetInfoValue
SetInfoValue
SetInfoPointer
SetInfoPointer
SetInfoValue