作为学习指针与值接收器的一部分,我提到了: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.
1 回答
LEATH
TA贡献1936条经验 获得超6个赞
您需要了解指针是什么,以便了解这里发生了什么。指针包含另一个变量的地址。
这两种类型的接收器不同,一种(指针)需要地址,另一种(值)期望不是地址。
现在,回答你的第一个问题:“为什么结果是一样的?
首先,是指向 的指针。这意味着 中包含的内容是 的地址。因此,两者最终都引用相同的结构(直接包含它和指向它的地址)。所以最后它是同一个结构。rp
r
rp
r
r
rp
r
rp
此外,原因和可以与指针和值接收器一起使用的原因是:Go在调用时自动获取包含在地址中的内容(作为值接收器需要不是地址),并且它会自动获取用于调用时传递的地址(作为指针接收器需要一个地址)。r
rp
rp
perim()
r
area()
回答你的第二个问题:“这是什么意思...?
要理解这一点,您需要知道 Go 中的所有函数都使用按值传递。这意味着,当您将具有许多字段的结构传递给函数时,整个结构及其所有字段将被复制到要在函数内部使用的新变量中。但是,如果传递指针(具有许多字段的结构的地址),则仅将该地址复制到要在函数内部使用的变量中 - 这大大减少了复制。
- 1 回答
- 0 关注
- 67 浏览
添加回答
举报
0/150
提交
取消