为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
四季花海 2022-11-08 15:16:33
type Number interface {    int | int64 | float64}type NNumber interface {}//interface contains type constraints//type NumberSlice []Numbertype NNumberSlice []NNumberfunc 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看起来相似,但是什么是类型约束,看起来语法很奇怪
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

语言规范明确禁止使用带有类型元素的接口作为类型参数约束以外的任何东西(引号在Interface types段落下):

非基本接口只能用作类型约束,或用作其他接口的元素用作约束。它们不能是值或变量的类型,也不能是其他非接口类型的组件。

嵌入的接口comparable或其他非基本接口也是非基本接口。您的Number界面包含一个联合,因此它也是非基本的。

几个例子:

// basic: only methods

type A1 interface {

    GetName() string

}


// basic: only methods and/or embeds basic interface

type B1 interface {

    A1

    SetValue(v int)

}


// non-basic: embeds comparable

type Message interface {

    comparable

    Content() string

}


// non-basic: has a type element (union)

type Number interface {

    int | int64 | float64

}


// non-basic: embeds a non-basic interface

type 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

}


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信