具有指针接收器与值的方法,值与指针之间的转换

作为学习指针与值接收器的一部分,我提到了:https://gobyexample.com/methods


// This `area` method has a _receiver type_ of `*rect`.

func (r *rect) area() int {

    return r.width * r.height

}


// Methods can be defined for either pointer or value

// receiver types. Here's an example of a value receiver.

func (r rect) perim() int {

    return 2*r.width + 2*r.height

}


func main() {

    r := rect{width: 10, height: 5}


    // Here we call the 2 methods defined for our struct.

    fmt.Println("area: ", r.area())

    fmt.Println("perim:", r.perim())


    // Go automatically handles conversion between values

    // and pointers for method calls. You may want to use

    // a pointer receiver type to avoid copying on method

    // calls or to allow the method to mutate the

    // receiving struct.

    rp := &r

    fmt.Println("area: ", rp.area())

    fmt.Println("perim:", rp.perim())

}

我不明白-->


rp := &r   

rp is a pointer or address of r

为什么结果:


rp.area()  is identical to r.area() 

rp.perim()  is identical to r.perim()

指针 :它们是内存中 var 的地址。


功能区() 需要一个指针接收器。所以这是明确的rp.area()(因为rp是r的指针或地址)


但是为什么这个r.area()?r 不是指针,而是值


同样,perim需要一个值,我们使用指针作为接收器?rp.perim()


这也意味着什么:


您可能希望使用指针接收器类型,以避免在方法调用时进行复制,或允许方法改变接收结构。


to avoid copying on method calls or to allow the method to mutate the receiving struct.



交互式爱情
浏览 68回答 1
1回答

LEATH

您需要了解指针是什么,以便了解这里发生了什么。指针包含另一个变量的地址。这两种类型的接收器不同,一种(指针)需要地址,另一种(值)期望不是地址。现在,回答你的第一个问题:“为什么结果是一样的?首先,是指向 的指针。这意味着 中包含的内容是 的地址。因此,两者最终都引用相同的结构(直接包含它和指向它的地址)。所以最后它是同一个结构。rprrprrrprrp此外,原因和可以与指针和值接收器一起使用的原因是:Go在调用时自动获取包含在地址中的内容(作为值接收器需要不是地址),并且它会自动获取用于调用时传递的地址(作为指针接收器需要一个地址)。rrprpperim()rarea()回答你的第二个问题:“这是什么意思...?要理解这一点,您需要知道 Go 中的所有函数都使用按值传递。这意味着,当您将具有许多字段的结构传递给函数时,整个结构及其所有字段将被复制到要在函数内部使用的新变量中。但是,如果传递指针(具有许多字段的结构的地址),则仅将该地址复制到要在函数内部使用的变量中 - 这大大减少了复制。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go