Go语言方法
Go语言方法
两种接收者
Go语言方法有他的接收者,如下代码
package main
import "fmt"
type A struct {
name string
}
func (a A) Name() string {
a.name = "hi" + a.name
return a.name
}
func main() {
a := A{
name:"ymk",
}
fmt.Println(a.Name())
fmt.Println(A.Name(a))
fmt.Println(a.name)
这段代码中,Name方法的接收者是A结构体的变量。方法接收者其实就是方法的一个参数,所以这里a.Name()与A.Name(a)是等价的运行后,的效果如下
PS D:\chengxu\test\go> go run .\main.go
hiymk
hiymk
ymk
因为这里a是值传递,因此在Name方法里改变a.name并不会影响实际的a。
如果将方法改写,这里方法的接收者是指针值,因此a会受影响
func (a *A) Name() string {
a.name = "hi" + a.name
return a.name
}
func main() {
a := A{
name:"ymk",
}
fmt.Println(a.Name())
fmt.Println((*A).Name(&a))
fmt.Println(a.name)
}
PS D:\chengxu\test\go> go run .\main.go
hiymk
hihiymk
hihiymk
将一个类型的方法赋给一个变量
type A struct {
name string
}
func (a A) GetName() string {
return a.name
}
func main() {
a := A{name:"ymk"}
f1 := A.GetName
fmt.Println(f1(a))
f2 := a.GetName
a.name = "yyy"
fmt.Println(f2())
}
执行结果
PS D:\chengxu\test\go> go run .\main.go
ymk
ymk
这里的f1是一个方法表达式,f2是一个方法变量,并且把a捕获进去形成了闭包。他们本质上都是function value
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具