Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 方法与指针接收器vs值、值和指针之间的转换_Go - Fatal编程技术网

Go 方法与指针接收器vs值、值和指针之间的转换

Go 方法与指针接收器vs值、值和指针之间的转换,go,Go,作为学习指针与值接收器的一部分,我提到: 我不明白--> 为什么结果是: rp.area() is identical to r.area() rp.perim() is identical to r.perim() 指针:它们是内存中变量的地址 函数区域()需要一个指针接收器。这就是清晰的rp.area()(因为rp是r的指针或地址) 但是为什么是这个区域呢?r不是指针,而是一个值 类似地,perim需要一个值,我们使用指针作为接收器?佩里姆议员() 这又意味着什么: 您可能希望使用指

作为学习指针与值接收器的一部分,我提到:

我不明白-->

为什么结果是:

rp.area()  is identical to r.area() 
rp.perim()  is identical to r.perim()
指针:它们是内存中变量的地址

函数区域()需要一个指针接收器。这就是清晰的rp.area()(因为rp是r的指针或地址)

但是为什么是这个区域呢?r不是指针,而是一个值

类似地,perim需要一个值,我们使用指针作为接收器?佩里姆议员()

这又意味着什么:

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

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

为了理解这里发生的事情,您需要理解指针是什么。指针包含另一个变量的地址

这两种类型的接收器不同,一个(指针)需要地址,另一个(值)不需要地址

现在,回答你的第一个问题:“为什么结果是一样的?”

首先,
rp
是指向
r
的指针。意思是
rp
中包含的是
r
的地址。因此,
r
rp
最终都指向同一个结构(
r
直接包含它,并且
rp
中的地址指向它)。因此,最终它是相同的结构

另外,
r
rp
均可用于指针和值接收器的原因如下: Go在调用
perim()
(作为值接收者不需要地址)时自动获取
rp
中包含的地址,并且在调用
area()
时自动获取
r
的地址(作为指针接收者需要地址)

回答你的第二个问题:“这意味着什么……”


要理解这一点,您需要知道Go中的所有函数都使用传递值。这意味着,当您将一个包含多个字段的结构传递给一个函数时,整个结构及其所有字段将被复制到一个新变量中,以便在函数中使用。但是,如果您传递一个指针(一个包含许多字段的结构地址),则只有该地址被复制到一个变量中,以便在函数内部使用,这就不需要复制了。

THx我确实理解指针(它们是内存中变量的地址)。功能区需要一个指针接收器。这很清楚rp.area()(因为rp是r的指针或地址),但为什么是r.area()?r不是一个指针,它是一个值,这是我的QNote的本质:我把上面的注释复制到一个答案中,因为它们有点长。回答:当您调用
r.area()
时,Go会自动将指针指向
r
。我还发现奇怪的是,当我第一次看到这一点时,这不是一个编译错误,但这就是Go的工作原理。这是一个Go游乐场,展示了我提到的内容:(也张贴在我下面的答案上)ffok这句话很有帮助,因为它在Go中必须是唯一的,对吗?“”另外,r和rp都可以用于指针和值接收器的原因是:Go在调用perim()时自动获取rp中包含的地址(作为值接收器,它不需要地址),在调用area()时自动获取r的地址以通过(作为指针接收器,它需要一个地址)。”是的,没错。这是一个围棋场,展示了自动指针创建:谢谢你刚才给我看的那个游戏场。我以前无法理解它的值和指针接收器的行为方式完全相同,但现在我明白它在围棋中是独一无二的。这非常有用。指针的整个概念结构和地址,我很久以前在C中学习过,然后我切换到python。在上面的C中是不可能的,这就是我困惑的地方。
rp.area()  is identical to r.area() 
rp.perim()  is identical to r.perim()
to avoid copying on method calls or to allow the method to mutate the receiving struct.