将值文字分配给泛型类型的结构字段而不会遇到 IncompatibleAssign 错误

这可以:


type constraint interface {

    ~float32 | ~float64

}


type foo[T constraint] struct {

    val T

}


func (f *foo[float64]) setValToPi() {

    f.val = 3.14

}

但是,如果我更改constraint为还包含int类型,则会遇到错误:


type constraint interface {

    ~float32 | ~float64 | ~int

}


type foo[T constraint] struct {

    val T

}


func (f *foo[float64]) setValToPi() {

    f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment

}

为什么包含不属于同一“类型组”的类型的约束会导致此错误,我应该如何处理?


慕神8447489
浏览 121回答 1
1回答

慕妹3242003

这个语法:func (f *foo[float64]) setValToPi() {    // ...}只是一个方法声明。它不实例化泛型类型foo。float64方括号内的标识符是类型参数的名称。T就像在类型定义中一样,它也可以是。就像你写的:type foo[float64 constraint] struct {    val float64}由于float64是一个预先声明的标识符,您可以使用类型参数名称来隐藏它。因此,在该方法setValToPi中,关于 of 类型的唯一已知信息val是它被限制为constraint,例如 的并集~float32 | ~float64 | ~int。如果将方法声明更改为:func (f *foo[T]) setValToPi() {    // ...}T相反,您将得到相同的错误:不能在赋值中使用 3.14(无类型浮点常量)作为 T 值并且错误是由于3.14(一个无类型的浮点常量)不能总是分配给所有可能的实例foo[T],特别T是确实是的实例~int。float64以标识符为类型参数的游乐场: https ://gotipplay.golang.org/p/1EuAsSKdihK
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go