接口包含类型约束:不能在转换中使用接口

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看起来相似,但是什么是类型约束,看起来语法很奇怪


四季花海
浏览 221回答 1
1回答

翻阅古今

语言规范明确禁止使用带有类型元素的接口作为类型参数约束以外的任何东西(引号在Interface types段落下):非基本接口只能用作类型约束,或用作其他接口的元素用作约束。它们不能是值或变量的类型,也不能是其他非接口类型的组件。嵌入的接口comparable或其他非基本接口也是非基本接口。您的Number界面包含一个联合,因此它也是非基本的。几个例子:// basic: only methodstype A1 interface {    GetName() string}// basic: only methods and/or embeds basic interfacetype B1 interface {    A1    SetValue(v int)}// non-basic: embeds comparabletype Message interface {    comparable    Content() string}// non-basic: has a type element (union)type Number interface {    int | int64 | float64}// non-basic: embeds a non-basic interfacetype SpecialNumber interface {    Number    IsSpecial() bool}在变量的初始化中a,你试图Number在类型转换中使用Number(1),这是不允许的。您只能Number用作类型参数约束,即限制允许实例化泛型类型或函数的类型。例如:type Coordinates[T Number] struct {    x, y T}func sum[T Number](a, b T) T {    return a + b}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go