值类型、指针类型接收器和接口类型赋值总结

值接收器和指针接收器

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()
}
/*
汪汪汪
喵喵喵
喵喵喵
*/

可以看出对于接口用 指针接收器类型 对接口方法实现 ,值类型不可以直接赋给接口类型,也不可以用来调用函数,因为它(值类型)其实没有实现接口(真正实现的是结构体指针类型)。

总结

  • 接口的 指针类型接收器 只能用 指针类型 调用。
  • 其他的 指针类型接收器 和 值类型接收器 的函数,可以用指针类型调用,也可以用值类型调用。
原文地址:https://www.cnblogs.com/iQXQZX/p/14063460.html