[英]Why does a method with a pointer receiver still work when it receives a value?
我只是在環游世界中練習51練習 。 解釋聲稱Scale
方法在接收到Vertex
而不是指向Vertex
的指針時無效。
然而,當我改變聲明v := &Vertex{3, 4}
以v := Vertex{3, 4}
在main
輸出唯一的變化是缺失&
來標記指針。
那么,即使變量不是指針,為什么Scale
也會更改它收到的變量?
游覽建議的區別實際上不是將v := &Vertex{3, 4}
更改為v:= Vertex{3, 4}
,而是更改了這兩種方法的定義,以便它們使用值而不是值指針。 因此,例如,對於Scale
, func (v *Vertex) Scale(f float64) {...
變為func (v Vertex) Scale(f float64) {...
(請注意(v *Vertex)
,一個指針值,變為(v Vertex)
,一個非指針值)。 在這兩種情況下,都應將v
的聲明保留為v := &Vertex{3, 4}
。
您會注意到,在第一種情況下,當方法使用指針時,輸出為&{15 20} 25
。 但是,當方法采用值而不是指針時,輸出為&{3 4} 5
。
在這兩種情況下, v
都是指向Vertex
對象的指針。 在第一種情況下,將指針傳遞給方法,並且一切都按預期工作-對Vertex
對象所做的任何修改都將對原始值進行,因此這些更改在方法返回后仍然存在。 在第二種情況下,盡管v
仍然是指針,但是Go編譯器足夠聰明,可以將v.Scale(5)
轉換為(*v).Scale(5)
,其中v
被取消引用,並將結果值傳遞給Scale
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.