值接收器和指针接收器
package main
import "fmt"
type stu struct {
Name string
Age int
}
func (s stu) changeName(name string) {
s.Name = name
}
func (s *stu) changeAge(age int) {
s.Age = age
}
func main() {
student := stu{
Name: "a",
Age: 0,
}
fmt.Println("原始数据", student)
student.changeName("b")
student.changeAge(10)
fmt.Println("结构体变量传递", student)
//var ptr *stu = &student
(&student).changeName("c")
(&student).changeAge(20)
fmt.Println("结构体指针传递", student)
}
/*
原始数据 {a 0}
结构体变量传递 {a 10}
结构体指针传递 {a 20}
*/
可以看出对于 指针类型接收器 和 值类型接收器 的函数,可以使用 指针类型调用 也可以使用 值类型调用 。并且只要调用了指针类型的接收器,不管是值类型进行的调用还是指针类型进行的调用,都可以对数据进行修改;相反,调用了值类型接收器,不管是值类型进行的调用还是指针类型进行的调用,都不能对数据进行修改。
关于接口类型接收具体类型
package main
import "fmt"
type Animal interface {
say()
}
type dog struct {
Name string
}
func (d *dog) say() {
fmt.Println("汪汪汪")
}
type cat struct {
Name string
}
func (c cat) say() {
fmt.Println("喵喵喵")
}
func main() {
dog := dog{Name: "dog"}
cat := cat{Name: "cat"}
/*Cannot use 'dog' (type dog) as type introduction Type does not implement 'Animal' as 'say' method has a pointer receiver*/
//var animal1 Animal = dog // 报错
var animal11 Animal = &dog
//animal1.say()
animal11.say()
var animal2 Animal = cat
var animal22 Animal = &cat
animal2.say()
animal22.say()
}
/*
汪汪汪
喵喵喵
喵喵喵
*/
可以看出对于接口用 指针接收器类型 对接口方法实现 ,值类型不可以直接赋给接口类型,也不可以用来调用函数,因为它(值类型)其实没有实现接口(真正实现的是结构体指针类型)。
总结
- 接口的 指针类型接收器 只能用 指针类型 调用。
- 其他的 指针类型接收器 和 值类型接收器 的函数,可以用指针类型调用,也可以用值类型调用。