Go 方法接收者超清晰笔记(类型名 vs 变量名)
学习 Go 结构体方法时必须彻底分清类型名和变量名否则容易报错或理解错误。一、核心概念1. 类型名由type定义的名字代表「种类、模板」不是具体对象。示例typeStustruct{Ageint}Stu是类型名地位等同于int、string。特点只代表“这一类数据”没有内存、没有具体值不能直接使用.字段例如Stu.Age会报错2. 变量名根据类型创建的实例占用内存存储真实数据。示例vars Stu s.Age18s是变量名具体对象特点可以访问字段.Age是实实在在的对象存储实际数据3. 极简口诀类型 模板 变量 实物 只能用实物访问字段类型不能访问字段二、为什么(stu) getAge()必报错错误示例func(stu)getAge()int{returnstu.Age}报错原因(stu)只有类型名没有接收者变量名方法体内的stu不是实例变量类型本身没有字段无法访问stu.Age正确写法func(s Stu)getAge()int{returns.Age}s接收者变量Stu接收者类型三、Go 方法接收者固定语法func(变量名 类型)方法名()返回值类型{}变量名代表当前调用方法的对象实例类型结构体类型特殊补充只写类型、不写变量名代码能编译但无法访问任何字段func(Stu)hello()string{returnhi}场景纯工具方法、不操作对象字段时可用业务开发几乎不用。四、值接收者 vs 指针接收者1. 值接收者(s Stu)传副本修改不影响原对象值和指针对象都可以调用示例func(s Stu)SetAge(ageint){s.Ageage}调用stu:Stu{18}stu.SetAge(20)fmt.Println(stu.Age)// 18原对象未修改2. 指针接收者(s *Stu)传原对象地址修改会影响原对象调用时 Go 会自动取地址s.setAge()等价于(s).setAge()示例func(s*Stu)SetAge(ageint){s.Ageage}stu:Stu{18}stu.SetAge(20)fmt.Println(stu.Age)// 20原对象被修改五、终极总结Stu是类型名模板、种类不能访问字段s是变量名实例对象可以访问字段方法接收者必须(变量名 类型)缺一不可无变量名的接收者无法操作结构体字段值接收者修改的是副本指针接收者修改的是原对象stu.GetAge()本质类似GetAge(stu)接收者变量代表当前调用对象六、一句话记忆法类型 图纸 变量 房子 字段属于房子不属于图纸 接收者变量代表当前这套房子 接收者类型代表这种房子的设计图