【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: &{黑黑}