用实例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