首頁 >後端開發 >Golang >如何解決 Go 泛型中的「無法使用 *T 類型的變數作為 stringer 類型」錯誤?

如何解決 Go 泛型中的「無法使用 *T 類型的變數作為 stringer 類型」錯誤?

Linda Hamilton
Linda Hamilton原創
2024-12-20 15:22:10838瀏覽

How Can I Resolve the

泛型中的型別安全注意事項

在 Go 的泛型中,型別參數 T 與約束介面 FooBar 不同。然而,這種區別提出了一個問題:如何將 T 的實例傳遞給需要實現 stringer 的類型的函數(就像這樣做一樣)?

理解錯誤

錯誤訊息「不能使用*T 類型的變數作為要執行的參數中的類型字串」表示blah 的參數t 被錯誤地識別為實現的類型縱梁。然而,T 本身並不具備這種方法。

解決問題

要實現t 到stringer 的轉換,需要執行以下步驟:

  1. 為Foo 引入stringer 介面:為FooBar 新增stringer FooBar 約束,允許所有滿足FooBar 的型別都有 stringer 方法。
  2. 更改 union 中的類型:修改 FooBar 約束以接受指向 foo 或 bar 的指針,作為接收器類型stringer 是一個指針。
  3. 將複合文字宣告為指標:因為你不能宣告在沒有核心類型的限制上複合文字,需要將 t 宣告為指標型別。
  4. 為 FooBar 引入型別參數:將 FooBar 中的型別並集擷取到新的型別參數中確保 U 和 T 具有相容的型別集。

最終程式碼

說明

現在,當類型的變數被呼叫時,T t被宣告為指標。 FooBar[T] 將 U 約束為包含指向 T 的指標的型別。將 &t 轉換為 U 是有效的,並且 FooBar[T] (包括 stringer)的方法可供接收者 t 使用。

注意:

使用 FooBar 的類型參數允許傳遞參數並消除中間的需要詭計。例如,您可以將 blah 修改為:

並用 blah(&foo{}) 呼叫它。

以上是如何解決 Go 泛型中的「無法使用 *T 類型的變數作為 stringer 類型」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn