结论:接口的指针类型接收器只能用指针类型调用。其他的指针类型接收器和值类型接收器可以用指针类型接收器调用,也可以用值类型接收器调用。以下给出分析:
1、首先给出值接收器和指针接收器一段代码
type stut struct {
name string
grade int
}
//值接收器
func (s stut) changeName(nName string) {
s.name = nName
}
//指针接收器
func (s *stut) changeGrade(nGrade int) {
s.grade = nGrade
}
func main() {
stu := stut{
name: "kyton",
grade: 96,
}
fmt.Println("原始数据:", stu)
stu.changeName("newton")
stu.changeGrade(98)
fmt.Println("变量传递:", stu)
(&stu).changeName("Einstein")
(&stu).changeGrade(100)
fmt.Println("地址传递", stu)
}
运行结果:
原始数据: {kyton 96}
值接收器: {kyton 98}
指针接收器 {kyton 100}
可以看出对于指针类型接收器和值类型接收器,可以使用指针类型接收器调用也可以使用值类型接收器调用。
2、上述代码很容易理解,下面继续给出代码
type introduction interface {
intro()
}
type stut struct {
name string
grade int
}
type cat struct {
name string
age int
}
//值接收器
func (s stut) intro() {
fmt.Printf("%s's grade is %d\n", s.name, s.grade)
}
//指针接收器
func (c *cat) intro() {
fmt.Printf("%s is %d years old\n", c.name, c.age)
}
func main() {
stu := stut{
name: "kyton",
grade: 96,
}
ca := cat{
name: "tom",
age: 6,
}
var s1, c1 introduction
fmt.Println("原始数据:", stu)
s1 = stu
s1.intro()
s1 = &stu
s1.intro()
fmt.Println("原始传递:", ca)
//c1 = ca
/*Cannot use 'ca' (type cat) as type introduction Type does not
implement 'introduction' as 'intro' method has a pointer receiver
*/
c1 = &ca
c1.intro()
(&ca).intro()
}
可以看出对于指针接收器类型的接口实现,值类型是不可以调用的,因为其没有实现接口。
综上:接口的指针类型接收器只能用指针类型调用。
其他的指针类型接收器和值类型接收器可以用指针类型接收器调用,也可以用值类型接收器调用。