package main
import "fmt"
type Cat struct {
Size int
}
type Duck interface {
BiggerValue()
BiggerPointer()
}
func(c Cat) BiggerValue(){
c.Size = c.Size*2
}
func(c *Cat) BiggerPointer(){
c.Size = c.Size*2
}
func main() {
//虽然传入的是指针,并且在接受者是结构体时,发生了隐式的解引用,但仍然无法改变结构体中的变量值
//证明在解引用后,发生了一次结构体的复制
//注意这里struct 转 interface 的条件
//*T 是包含 T 和 *T 的方法集, 所以这里的指针类型可以赋值到Duck
var d Duck = &Cat{Size: 3}
d.BiggerValue()
fmt.Println(d) //&{3}
//error
//这个就是不可以赋值的
//T类型只包含值接收者的方法集,而Cat值类型并没有实现BiggerPointer方法,所以无法赋值给Duck
//var d Duck = Cat{Size: 3}
//
var c = Cat{Size: 4}
c.BiggerValue()
fmt.Println(c)
c.BiggerPointer()
fmt.Println(c)
var cc = &Cat{Size: 5}
cc.BiggerValue()
fmt.Println(cc)
cc.BiggerPointer()
fmt.Println(cc)
}