結論:接口的指針類型接收器只能用指針類型調用。其他的指針類型接收器和值類型接收器可以用指針類型接收器調用,也可以用值類型接收器調用。以下給出分析:
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()
}
可以看出對於指針接收器類型的接口實現,值類型是不可以調用的,因爲其沒有實現接口。
綜上:接口的指針類型接收器只能用指針類型調用。
其他的指針類型接收器和值類型接收器可以用指針類型接收器調用,也可以用值類型接收器調用。