為什麼 Go 結構體變數不能實作有指標接收器的介面?
在 Go 中,結構體方法可以有任一值接收器(操作直接作用於結構體值)或指標接收器(作用於指向結構體的指標)。在實作介面時,根據介面方法的接收者類型,哪些類型可以滿足介面有一些微妙的限制。
考慮以下程式碼:
type greeter interface { hello() goodbye() } type tourGuide struct { name string }
我們可以定義方法tourGuide 的值和指標接收器:
func (t tourGuide) hello() { fmt.Println("Hello", t.name) } func (t *tourGuide) goodbye() { fmt.Println("Goodbye", t.name) }
現在,這是關鍵區別:
-
tourGuide的變數或副本可以呼叫值和指標接收器方法:
var t1 tourGuide = tourGuide{"James"} t1.hello() // works t1.goodbye() // works
-
但是,介面變數只能是從可以實現與介面具有相同接收器類型的所有介面方法的類型分配本身:
var g2 greeter = &t2 // works because *tourGuide implements greeter's pointer receiver methods // illegal: t1 is not assignable to g1 // var g1 greeter = t1 // error: cannot use tourGuide as type greeter in assignment because tourGuide does not implement greeter (hello method has value receiver)
那麼,為什麼t1不能實作greeter介面呢?
原因是greeter介面中的hello()方法有一個指標接收器,這表示它需要一個指向tourGuide值的指標作為接收器。但是,t1 是一個變數(不是指標)。儘管值變數是可尋址的,但介面值保留儲存值的副本,而不是引用。因此,當將值變數指派給介面變數時,它會建立一個新的副本,該副本無法取消引用並作為指標接收器方法的接收器傳遞。
綜上所述,在使用指標接收器方法實作介面時,只能使用指標實作類型可以滿足介面。值變數或副本不可指派給此類接口,因為它們無法提供所需的指標接收器類型。
以上是為什麼具有值接收器的 Go 結構不能實作與指標接收器的介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文解釋了GO的軟件包導入機制:命名imports(例如導入“ fmt”)和空白導入(例如導入_ fmt; fmt;)。 命名導入使包裝內容可訪問,而空白導入僅執行t

本文詳細介紹了MySQL查詢結果的有效轉換為GO結構切片。 它強調使用數據庫/SQL的掃描方法來最佳性能,避免手動解析。 使用DB標籤和Robus的結構現場映射的最佳實踐

本文解釋了Beego的NewFlash()函數,用於Web應用程序中的頁間數據傳輸。 它專注於使用newflash()在控制器之間顯示臨時消息(成功,錯誤,警告),並利用會話機制。 Lima

本文演示了創建模擬和存根進行單元測試。 它強調使用接口,提供模擬實現的示例,並討論最佳實踐,例如保持模擬集中並使用斷言庫。 文章

本文探討了GO的仿製藥自定義類型約束。 它詳細介紹了界面如何定義通用功能的最低類型要求,從而改善了類型的安全性和代碼可重複使用性。 本文還討論了局限性和最佳實踐

本文詳細介紹了在GO中詳細介紹有效的文件,將OS.WriteFile(適用於小文件)與OS.openfile和緩衝寫入(最佳大型文件)進行比較。 它強調了使用延遲並檢查特定錯誤的可靠錯誤處理。

本文使用跟踪工具探討了GO應用程序執行流。 它討論了手冊和自動儀器技術,比較諸如Jaeger,Zipkin和Opentelemetry之類的工具,並突出顯示有效的數據可視化


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3漢化版
中文版,非常好用

記事本++7.3.1
好用且免費的程式碼編輯器

Dreamweaver Mac版
視覺化網頁開發工具