在程式設計領域,Go 之旅練習 51 提出了一個有趣的謎。 Scale 方法聲稱在接收 Vertex 值而不是指標時無效,但實際上違反了這個概念。
為了說明這一點,原始程式碼宣告 v,一個 Vertex 類型的變量,以 &v 的形式傳遞給 Scale 。令人驚訝的是,直接用 v 取代 &v 仍然會對輸出產生明顯的影響。
深入研究這種現象背後的機制,我們發現 Go 的強型別強制宣告明確的變數型別。當函數或方法需要指向某種類型的指標時,例如 T,只有該精確類型 (T) 的變數才能滿足此要求。
然而,Go 的編譯器具有隱藏的power:在特定條件下,它會為您轉換程式碼。當使用非指標變數 (x) 來呼叫接受指標接收器的方法 (m) 時,就會出現這樣的情況之一。這裡,編譯器介入並有效執行語句 (&x).m() 而不是 x.m()。這種令人著迷的行為與Go 的文檔一致,其中指出:
「如果x(的類型)的方法集包含m 並且參數列表可以分配給參數列表,則方法調用x.m() 是有效的如果x 是可尋址的且&x 的方法集包含m,則x.m() 是(&x).m()的簡寫:"
理解這個概念澄清了一個奇怪的觀察結果:即使提供了非指標參數,Scale 也會修改接收器:編譯器的靜默轉換確保預期的行為生效。
以上是為什麼 Go 的編譯器在呼叫方法時似乎隱式傳遞指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!