结构体/结构体指针-方法标准调用详解:
// 首先定义Person类型结构体
type Person struct {
name string
age int
}
- 情况1:接收者是结构体指针
// 接收者是一个结构体指针
func (p *Person)setAge(age int) {
p.age = age
}
func main() {
// 1.变量声明为结构体指针【此时,与接收者类型一致】
p1 := &Person{"张三", 10}
p1.setAge(24) // 标准调用方法,同时也是最简写法
fmt.Println((*p1).age) // 标准写法
fmt.Println(p1.age) // 简化写法
// 2.变量声明为普通结构体【此时,与接收者类型不一致】
p2 := Person{"李四", 10}
(&p2).setAge(25) // 标准调用方法:先拿到指针,然后再通过指针调用
fmt.Println(p2.age)
p2.setAge(26) // 简化写法:直接利用变量调用,底层会自动获取变量地址传递给接收者
fmt.Println(p2.age)
}
- 情况2:接收者是普通结构体
// 接收者是一个普通结构体
func (p Person)setName(name string) {
p.name = name
}
func main() {
// 1.变量声明为普通结构体【此时,与接收者类型一致】
p1 := Person{"张三", 10}
p1.setAge(24) // 标准调用方法,同时也是最简写法
// 2.变量声明为结构体指针【此时,与接收者类型不一致】
p2 := &Person{"李四", 10}
(*p2).setAge(25) // 标准调用方法:先拿到地址所对应的值类型,然后再通过值类型调用
p2.setAge(26) // 简化写法:直接利用指针调用,底层会自动获取变量值传递给接收者
}
总结:当接受者类型与结构体类型不一致时,都可以直接写成简化写法,即不考虑取地址还是取值。因为go语言不支持指针运算,其内部的Go语法糖操作会在类型不匹配时实现匹配。