关于golang方法的一些小点
本文在说什么
- 关于方法中的两个语法糖
- 一个设计规范
语法糖
在定义方法的时候,接收者可以是指针(*T
),也可以是普通变量(T).而在调用的时候却可以不用在乎.
type Info struct {
name string
age uint
}
func (i *Info)ChangeName(s string) {
i.name = s
}
func (i Info)say() {
fmt.Printf("%s yestoday %d yea's old", i.name, i.age)
}
func main() {
var i1 Info = Info{
name: "zhangsan",
age: 18,
}
i1.ChangeName("wangwu")
fmt.Println(i1)
var i2 *Info = &Info{
name: "liis",
age: 21,
}
i2.say()
}
i1.ChangeName("wangwu")
使用非指针调用,不仅成功,如果运行程序你就会i1.name
确实发生了变化.那是因为这句等价于&i1.ChangeName("wangwu")
而i2.say()
也调用成功了,运行会发现也输出正确,这是因为其等价于(*i2).say()
而这两个在本质上都是因为编译器优化后的语法糖的原因.
一人指针,全家指针
由于方法的接收者既可以是变量,也可以是指针,因此,容易出现混肴.所以在设计的时候有一个不成文的规定: 如果有一个方法的接收者是指针,那么其所有方法都需要是指针
嵌套匿名结构体
如果一个结构体(A)匿名嵌套了另一个结构体(B),那么A可以通过与匿名字段相同的方式调用B的方法,但是依旧要小心不要与A自己的方法冲突.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用