(18条消息) Go语言自学系列 | golang接口值类型接收者和指针类型接收者_COCOgsta的博客-CSDN博客



Go语言自学系列 | golang接口值类型接收者和指针类型接收者

COCOgsta 于 2022-04-23 21:46:24 发布 34 收藏
分类专栏: 视频学习笔记 文章标签: golang

视频来源:B站《golang入门到项目实战 [2021最新Go语言教程,没有废话,纯干货!持续更新中...]》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:Go语言自学系列 | 汇总_COCOgsta的博客-CSDN博客


这个话题,本质上和方法的值类型接收者和指针类型接收者的思考方法是一样的,值接收者是一个拷贝,是一个副本,而指针接收者,传递的是指针

实例演示

定义一个Pet接口

  1. 1
    type Pet interface {
  2. 2
    eat()
  3. 3
    }

定义一个Dog结构体

  1. 1
    type Dog struct {
  2. 2
    name string
  3. 3
    }

实现Pet接口(接收者是值类型)

  1. 1
    func (dog Dog) eat() {
  2. 2
    fmt.Printf("dog: %p\n", &dog)
  3. 3
    fmt.Println("dog eat...")
  4. 4
    dog.name = "黑黑"
  5. 5
    }
  6. 6

测试

  1. 1
    package main
  2. 2
  3. 3
    import "fmt"
  4. 4
  5. 5
    type Pet interface {
  6. 6
    eat()
  7. 7
    }
  8. 8
  9. 9
    type Dog struct {
  10. 10
    name string
  11. 11
    }
  12. 12
  13. 13
    func (dog Dog) eat() {
  14. 14
    fmt.Printf("dog: %p\n", &dog)
  15. 15
    fmt.Println("dog eat...")
  16. 16
    dog.name = "黑黑"
  17. 17
    }
  18. 18
  19. 19
    func main() {
  20. 20
    dog := Dog{name: "花花"}
  21. 21
    fmt.Printf("dog: %p\n", &dog)
  22. 22
    dog.eat()
  23. 23
    fmt.Printf("dog: %v\n", dog)
  24. 24
    }

运行结果

  1. 1
    [Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\tempCodeRunnerFile.go"
  2. 2
    dog: 0xc000050230
  3. 3
    dog: 0xc000050240
  4. 4
    dog eat...
  5. 5
    dog: {花花}

从运行结果,我们看出dog的地址变了,说明是复制了一份,dog的name没有变说明外面的dog变量没有被改变。

将Pet接口改为指针接收者

  1. 1
    package main
  2. 2
  3. 3
    import "fmt"
  4. 4
  5. 5
    type Pet interface {
  6. 6
    eat()
  7. 7
    }
  8. 8
  9. 9
    type Dog struct {
  10. 10
    name string
  11. 11
    }
  12. 12
  13. 13
    func (dog *Dog) eat() {
  14. 14
    fmt.Printf("dog: %p\n", dog)
  15. 15
    fmt.Println("dog eat...")
  16. 16
    dog.name = "黑黑"
  17. 17
    }
  18. 18
  19. 19
    func main() {
  20. 20
    dog := &Dog{name: "花花"}
  21. 21
    fmt.Printf("dog: %p\n", dog)
  22. 22
    dog.eat()
  23. 23
    fmt.Printf("dog: %v\n", dog)
  24. 24
    }

运行结果

  1. 1
    [Running] go run "d:\SynologyDrive\软件开发\go\golang入门到项目实战\goproject\360duote.com\pro01\test.go"
  2. 2
    dog: 0xc000050230
  3. 3
    dog: 0xc000050230
  4. 4
    dog eat...
  5. 5
    dog: &{黑黑}

yg9538 2022年7月22日 22:48 683 收藏文档