介面類型約束:理解並避免「類型約束」錯誤
在Go 中,介面是強大的構造,它定義了一組方法,類型必須實作。然而,並非所有介面都是一樣的。包含類型約束的介面對其使用施加了額外的限制。
考慮以下型別定義:
type Number interface { int | int64 | float64 }
此介面定義了可以表示 int、int64 或 float64 的 Number 類型。然而,Go 語言規範明確禁止在除類型參數約束之外的任何上下文中使用具有類型元素的此類介面。
當您嘗試將介面與在其他場景中鍵入元素。例如,下面的程式碼片段將無法編譯:
type NumberSlice []Number // interface contains type constraints func main() { a := []Number{Number(1), Number(2), Number(3), Number(4)} // cannot use interface Number in conversion }
此錯誤是因為 Number 是一個有類型約束的接口,因此不能用作切片的元素類型。
與類型元素的介面類似,嵌入類似或其他非基本介面的介面也是非基本的。為了避免這些錯誤,請確保您的介面僅包含方法或嵌入基本介面。
基本和非基本介面範例:
基本:僅方法
type A1 interface { GetName() string }
type B1 interface { A1 SetValue(v int) }
type Message interface { comparable Content() string }
type Number interface { int | int64 | float64 }
type SpecialNumber interface { Number IsSpecial() bool }
有型別約束的介面只能用作型別參數限制。例如:
在此場景中,介面用於限制泛型類型和函數允許的類型。type Coordinates[T Number] struct { x, y T } func sum[T Number](a, b T) T { return a + b }
以上是為什麼 Go 中禁止使用類型約束的介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!