Golang Go语言中非指针方法在什么时候使用?

发布于 1周前 作者 sinazl 来自 Go语言

Golang Go语言中非指针方法在什么时候使用?

我们都知道,Go 语言中的方法有两种,指针方法和非指针方法(其实我不确定是否叫这名)。其区别在于,调用非指针方法时,调用者会被拷贝。

func (r *Receiver)F() // 指针方法
func (r Receiver)F() // 非指针方法

用了一段时间 Go 以后,我发现,我从来没用过非指针方法,因为我认为额外的拷贝工作会造成性能的损失。我猜这是因为我用的时间太短,没遇到必须使用非指针方法的场景。

那么问题来了,到底什么情况下必须使用非指针方法,或使用非指针方法更优呢?


更多关于Golang Go语言中非指针方法在什么时候使用?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

obj.copy(), obj.clone() ((((

更多关于Golang Go语言中非指针方法在什么时候使用?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我记得 go 初始教程就有讲的,go 的 method 就是个函数语法糖
指针方法等于 func F(r *Receiver)
非指针就是 func F(r Receiver)

值类型跟引用类型分得清不,差不多类似,比如 time.Time 类型就是基本都是用值类型,然后它的操作方法就基本都是非指针方法

想了想感觉没说清楚,只是举个例子,还是先了解一下值类型传递跟引用类型传递概念吧

当你不确定用什么的时候,用指针 receive 就行了。

不要看到复制就以为性能低,内存复制很快的,用指针还要解指针,一样是要付出代价的
不需要改变的对象,就用值,需要改变的,就用指针

传值用于字段不多的结构体的除了改值和反射的情况. https://segment.com/blog/allocation-efficiency-in-high-performance-go-services

指针多了并不一定增加性能,反而会增加 gc 压力,从而降低性能

当你的 struct 只有 a few words,并且不需要修改,比如值语义的时候

需要修改实例就用指针,不需要就用非指针版本。

谢谢,这么说就很明白了

在Golang(Go语言)中,非指针方法(即值接收者方法)的使用场景主要集中在以下几种情况:

  1. 不可变性:当方法不需要修改接收者(即结构体实例)的状态时,使用值接收者方法可以确保数据的不变性。这有助于编写更安全、更易于理解的代码,因为调用者知道其数据不会被方法意外修改。

  2. 小结构体:对于较小的结构体,复制的成本相对较低。在这种情况下,使用值接收者方法可以避免指针解引用的开销,从而提高性能。

  3. 避免并发问题:值接收者方法天然避免了并发访问时的数据竞争问题,因为每个方法调用都操作的是接收者值的一个副本。这在多线程或并发编程环境中尤其有用。

  4. 临时对象:如果方法只是处理临时对象,这些对象在方法结束后就会被丢弃,那么使用值接收者方法更为合适。这可以减少不必要的内存分配和垃圾回收开销。

然而,需要注意的是,如果结构体较大或者方法需要修改接收者的状态,使用指针接收者方法会更高效,因为它避免了结构体的复制。此外,对于需要保持状态一致性的场景,指针接收者也是更好的选择。

总之,在选择使用非指针方法还是指针方法时,需要根据具体情况综合考虑方法的性能、安全性以及代码的可读性。在Go语言中,灵活选择接收者类型是实现高效、健壮代码的关键。

回到顶部