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


    值接收器和指针接收器

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

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

    总结

    • 接口的 指针类型接收器 只能用 指针类型 调用。
    • 其他的 指针类型接收器 和 值类型接收器 的函数,可以用指针类型调用,也可以用值类型调用。
  • 相关阅读:
    关于UltraISO打开iso文件后只有部分文件问题
    CollectionViewController 集合视图
    SDWebImage, 关于第三方异步加载图片的一些方法
    NSFileManager(文件管理类)
    UIReview(UI总结)
    sqlite( 轻量级数据库)
    DataPersistence(数据持久化: 文件读写, NSUserDefault, 归档)
    第三方(SDWebImage, 网络类AFNetWorking)
    网络编程(GET, POST)
    数据解析(SAX, JSON)
  • 原文地址:https://www.cnblogs.com/iQXQZX/p/14063460.html
Copyright © 2020-2023  润新知