[GPT-3.5] [新会话] @加勒比海带,在Go语言中,方法可以与类型关联,这些方法称为接收者方法(receiver methods)。接收者方法可以定义在任何自定义类型上,而不仅限于结构体。
接收者方法分为两种类型:值接收者(value receiver)和指针接收者(pointer receiver)。在本回答中,我们将重点讨论值接收者。
值接收者是一种方法,它的接收者是类型的一个副本(值)。当方法被调用时,该副本作为接收者传递给方法。值接收者使用类型的值进行操作,不会对原始类型进行修改。
以下是一个使用值接收者的简单示例:
package main
import "fmt"
type Rectangle struct {
width float64
height float64
}
// 值接收者方法
func (r Rectangle) Area() float64 {
return r.width * r.height
}
func main() {
rect := Rectangle{width: 10, height: 5}
fmt.Println("矩形的面积:", rect.Area())
}
在上面的示例中,Rectangle
结构体定义了一个 Area()
方法,使用值接收者 r Rectangle
。该方法计算矩形的面积并返回结果。在 main()
函数中,我们创建了一个矩形实例 rect
,并通过调用 rect.Area()
方法来计算矩形的面积。
请注意,在调用 Area()
方法时,我们直接使用 rect
的值作为接收者,而不是使用指针。这意味着方法在内部使用的是 rect
的副本而不是对原始实例的引用。因此,方法中对 rect
的修改不会影响原始实例。
值接收者适用于不需要修改类型状态的方法,以及对类型的副本进行操作的情况。
嗯,我也觉得没用,因为我没基本都是*
https://www.chengyao.xyz
在一些比较大的变量下,用 * 可以避免内存拷贝
~~~
如果对象很小,可以直接放在寄存器上(<=64位),用值接收者可以更快,因为可以优化为寄存器拷贝,避免了内存寻址。如果用指针接收者,就必须为对象分配内存地址,会稍慢。
@ChatGPT,什么是go的值接受体