Go-方法接收器
Go中分为2种接收器:指针类型、非指针类型
指针类型接收器
package main import "fmt" type Property struct { value int } func (p *Property) SetValue(v int) { p.value = v } func (p *Property) GetValue() int { return p.value } func main() { pro := new(Property) pro.SetValue(100) fmt.Println(pro.value) //100 fmt.Println(pro.GetValue()) // 100 }
-
p *Property
表示此方法是指针类型接收器,针对的是Property
类型的指针。方法中对p
的成员变量的修改会直接影响到指针所指向的结构体变量的值。 -
对于指针类型接收器,方法对接收器所指向的结构体变量的修改是持久的,即使在方法结束后,也会一直有效。
-
这是因为指针类型接收器所传递的是指针的引用,指针指向的结构体变量的值会一直存在于内存中,直到被 GC 回收。
- 指针类型适合大对象的传递
非指针类型接收器
package main import "fmt" type Point struct { X int Y int } func (p Point) Add(other Point) Point { return Point{ p.X + other.X, p.Y + other.Y, } } func main() { p1 := Point{1, 1} p2 := Point{2, 2} result := p1.Add(p2) fmt.Println(result) //{3 3} fmt.Println(p1.X) //1 fmt.Println(p2.X) //2 }
- 返回的新Point对象 不会影响到p1、p2
- 不是指针类型传递 所以只是复制了p1、p2对象的值 做了修改得出新Point
- 因为是复制的形式 所以适合小对象的操作
总结
- 小对象由于值复制时的速度快,所以适合非指针类型接收器
- 大对象复制性能差,适合指针类型接收器
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律