首頁 > 後端開發 > Golang > Go泛型的聯合約束可以在沒有明確介面宣告的情況下呼叫共享方法嗎?

Go泛型的聯合約束可以在沒有明確介面宣告的情況下呼叫共享方法嗎?

Linda Hamilton
發布: 2024-12-22 16:34:13
原創
561 人瀏覽過

Can Go Generics' Union Constraints Call Shared Methods Without Explicit Interface Declaration?

在Go 泛型中呼叫聯合約束方法

在Go 泛型(v1.18)中,您可能會遇到限制類型聯合約束的類型將參數類型轉換為實現統一介面的類型。然而,無法在受約束類型之間呼叫共享方法引起了人們對此類約束實用性的擔憂。

考慮以下程式碼:

type A struct {}
type B struct {}
type AB interface { *A | *B }

func (a *A) some() bool { return true }
func (b *B) some() bool { return false }

func some[T AB](x T) bool { return x.some() } // Compiler error
登入後複製

編譯器錯誤「x.some undefined」是由於類型聯合約束*A | *B 不保證*A 和*B 上都存在某個方法。

要解決此問題,可以將此方法加入介面約束:

type AB interface { *A | *B; some() bool }

func some[T AB](x T) bool { return x.some() } // Works
登入後複製

這個將 T 限制為同時實作 *A 或 *B 並宣告 some 方法的類型。

但是,此解決方案被視為理想情況下與類型聯合一起使用的解決方法 獨自的。 Go 1.18 目前存在一些限制,即僅當方法 m 由 P 的約束介面明確宣告時,編譯器才支援對型別參數 P 的值呼叫方法。儘管語言規範規定介面的方法集是介面的類型集中每種類型的方法集的交集。這個問題預計會在 Go 1.19 中解決。

以上是Go泛型的聯合約束可以在沒有明確介面宣告的情況下呼叫共享方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板