Go 方法接收者超清晰笔记(类型名 vs 变量名)

学习 Go 结构体方法时,必须彻底分清类型名和变量名,否则容易报错或理解错误。


一、核心概念

1. 类型名

type 定义的名字,代表「种类、模板」,不是具体对象。

示例:

go 复制代码
type Stu struct {
    Age int
}
  • Stu 是类型名,地位等同于 intstring
  • 特点:
    • 只代表"这一类数据",没有内存、没有具体值
    • 不能直接使用 .字段,例如 Stu.Age 会报错

2. 变量名

根据类型创建的实例,占用内存,存储真实数据。

示例:

go 复制代码
var s Stu
s.Age = 18
  • s 是变量名(具体对象)
  • 特点:
    • 可以访问字段 .Age
    • 是实实在在的对象,存储实际数据

3. 极简口诀

复制代码
类型 = 模板
变量 = 实物
只能用实物访问字段,类型不能访问字段

二、为什么 (stu) getAge() 必报错

错误示例:

go 复制代码
func (stu) getAge() int {
    return stu.Age
}

报错原因:

  1. (stu) 只有类型名,没有接收者变量名
  2. 方法体内的 stu 不是实例变量
  3. 类型本身没有字段,无法访问 stu.Age

正确写法:

go 复制代码
func (s Stu) getAge() int {
    return s.Age
}
  • s:接收者变量
  • Stu:接收者类型

三、Go 方法接收者固定语法

go 复制代码
func (变量名 类型) 方法名() 返回值类型 {}
  • 变量名:代表当前调用方法的对象(实例)
  • 类型:结构体类型

特殊补充

只写类型、不写变量名,代码能编译,但无法访问任何字段:

go 复制代码
func (Stu) hello() string {
    return "hi"
}

场景:纯工具方法、不操作对象字段时可用,业务开发几乎不用。


四、值接收者 vs 指针接收者

1. 值接收者 (s Stu)

  • 传副本,修改不影响原对象
  • 值和指针对象都可以调用

示例:

go 复制代码
func (s Stu) SetAge(age int) {
    s.Age = age
}

调用:

go 复制代码
stu := Stu{18}
stu.SetAge(20)
fmt.Println(stu.Age) // 18,原对象未修改

2. 指针接收者 (s *Stu)

  • 传原对象地址,修改会影响原对象
  • 调用时 Go 会自动取地址:s.setAge() 等价于 (&s).setAge()

示例:

go 复制代码
func (s *Stu) SetAge(age int) {
    s.Age = age
}

stu := Stu{18}
stu.SetAge(20)
fmt.Println(stu.Age) // 20,原对象被修改

五、终极总结

  1. Stu 是类型名:模板、种类,不能访问字段
  2. s 是变量名:实例对象,可以访问字段
  3. 方法接收者必须 (变量名 类型),缺一不可
  4. 无变量名的接收者,无法操作结构体字段
  5. 值接收者修改的是副本,指针接收者修改的是原对象
  6. stu.GetAge() 本质类似 GetAge(stu),接收者变量代表当前调用对象

六、一句话记忆法

复制代码
类型 = 图纸
变量 = 房子
字段属于房子,不属于图纸
接收者变量代表当前这套房子
接收者类型代表这种房子的设计图
相关推荐
Tangyuewei20 分钟前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界1 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
繁星蓝雨2 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
HotCoffee-GPS2 小时前
Golang性能分析pprof
golang
Evand J2 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
杜大哥2 小时前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python
wuyk5552 小时前
Python网络爬虫入门到实战 第01章:爬虫到底是什么?原理、流程、合法性、风险全解析(零基础必看)
开发语言·爬虫·python
yurenpai(27届找实习中)2 小时前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
疯狂打码的少年3 小时前
【计算机网络】TCP/IP协议族(四层体系结构,与OSI对比)
网络·笔记·tcp/ip·计算机网络
shmily麻瓜小菜鸡3 小时前
JS/TS 易踩坑知识点 — 模块化与工程化类
开发语言·javascript·ecmascript