關於Go中指針接收器與值接收器

結論:接口的指針類型接收器只能用指針類型調用。其他的指針類型接收器和值類型接收器可以用指針類型接收器調用,也可以用值類型接收器調用。以下給出分析:

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()
}

可以看出對於指針接收器類型的接口實現,值類型是不可以調用的,因爲其沒有實現接口。

綜上:接口的指針類型接收器只能用指針類型調用。
其他的指針類型接收器和值類型接收器可以用指針類型接收器調用,也可以用值類型接收器調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章