结构体/结构体指针-方法标准调用详解

142 阅读1分钟

结构体/结构体指针-方法标准调用详解:

 // 首先定义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语法糖操作会在类型不匹配时实现匹配。