type Number interface {
int | int64 | float64
}
type NNumber interface {
}
//interface contains type constraints
//type NumberSlice []Number
type NNumberSlice []NNumber
func main() {
var b interface{}
b = interface{}(1)
fmt.Println(b)
// interface contains type constraints
// cannot use interface Number in conversion (contains specific type constraints or is comparable)
//a := []Number{Number(1), Number(2), Number(3), Number(4)}
//fmt.Println(a)
aa := []interface{}{interface{}(1), interface{}(2), interface{}(3), 4}
fmt.Println(aa)
aaa := []NNumber{NNumber(1), NNumber(2), NNumber(3), 4}
fmt.Println(aaa)
}
為什么Number切片a不能這樣初始化?
NumberSlice和NNumberSlice看起來相似,但是什么是型別約束,看起來語法很奇怪
uj5u.com熱心網友回復:
錯誤資訊很清楚:
介面包含型別約束
不能在轉換中使用介面編號(包含特定型別約束或可比較)
并且語言規范明確禁止使用帶有型別元素的介面——或嵌入comparable的——作為型別引數約束以外的任何東西(引號被埋在Interface types段落中):
包含非介面型別、~T 形式的術語或聯合的介面只能用作型別約束,或用作用作約束的其他介面的元素。它們不能是值或變數的型別,也不能是其他非介面型別的組件。
您的Number介面包含一個非介面型別元素(聯合被視為一種型別元素,由幾個型別術語組成:
type Number interface {
int | int64 | float64
}
在變數的初始化中a,你試圖Number在型別轉換中使用Number(1),這是不允許的。
您只能Number用作型別引數約束,即限制允許實體化泛型型別或函式的型別。例如:
type Coordinates[T Number] struct {
x, y T
}
func sum[T Number](a, b T) T {
return a b
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/426095.html
