Golang入门到项目实战 | golang接口值类型接收者和指针类型接收者

Posted 一个热爱编程的通信人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang入门到项目实战 | golang接口值类型接收者和指针类型接收者相关的知识,希望对你有一定的参考价值。

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

实例演示

定义一个Pet接口

type Pet interface 
    eat()

定义一个Dog结构体

type Dog struct 
    name string

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

func (dog Dog) eat() 
    fmt.Printf("dog: %p\\n", &dog)
    fmt.Println("dog eat...")
    dog.name = "黑黑"

测试

package main

import "fmt"

type Pet interface 
    eat()


type Dog struct 
    name string


func (dog Dog) eat() 
    fmt.Printf("dog: %p\\n", &dog)
    fmt.Println("dog eat...")
    dog.name = "黑黑"


func main() 
    dog := Dogname: "花花"
    fmt.Printf("dog: %p\\n", &dog)
    dog.eat()
    fmt.Printf("dog: %v\\n", dog)

运行结果

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

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

将Pet接口改为指针接收者

package main

import "fmt"

type Pet interface 
    eat()


type Dog struct 
    name string


func (dog *Dog) eat() 
    fmt.Printf("dog: %p\\n", dog)
    fmt.Println("dog eat...")
    dog.name = "黑黑"


func main() 
    dog := &Dogname: "花花"
    fmt.Printf("dog: %p\\n", dog)
    dog.eat()
    fmt.Printf("dog: %v\\n", dog)

运行结果

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

以上是关于Golang入门到项目实战 | golang接口值类型接收者和指针类型接收者的主要内容,如果未能解决你的问题,请参考以下文章

Golang入门到项目实战 | golang接口嵌套

Golang入门到项目实战 | golang接口

Golang入门到项目实战 golang 函数

Golang入门到项目实战 | golang接口和类型的关系

Golang入门到项目实战 golang匿名函数

Golang入门到项目实战 | golang方法接收者类型