【Golang系列】-接口值类型接收者和指针类型接收者

2022-03-19

接口值类型接收者和指针类型接收者

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

实例:

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 := Dog{name: "大黑"}
    fmt.Printf("dog: %p\n", &dog)
    dog.eat()
    fmt.Println(dog)
}


结果:

dog: 0xc000116050
dog: 0xc000116060
dog eat...
{大黑}

从结果看,我们看见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 := &Dog{name: "花花"}
    fmt.Printf("dog: %p\n", dog)
    dog.eat()
    fmt.Printf("dog: %v\n", dog)
}

结果:

dog: 0xc000096220
dog: 0xc000096220
dog eat...
dog: &{黑黑}