将值文字分配给没有 运行 的泛型类型的结构字段进入 IncompatibleAssign 错误

Assigning a value literal to a struct field of a generic type without running into an IncompatibleAssign error

这很好:

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
}

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

此语法:

func (f *foo[float64]) setValToPi() {
    // ...
}

只是一个方法声明。它不实例化泛型类型foo。方括号中的标识符 float64 是类型参数的名称。它也可以是 T,就像在类型定义中一样。

就像你写的:

type foo[float64 constraint] struct {
    val float64
}

由于 float64 是一个预先声明的标识符,您可以用类型参数名称隐藏它。

所以在方法 setValToPi 中,关于 val 类型的唯一已知信息是它被限制为 constraint,例如~float32 | ~float64 | ~int.

的并集

如果将方法声明更改为:

func (f *foo[T]) setValToPi() {
    // ...
}

您将得到与 T 相同的错误:

cannot use 3.14 (untyped float constant) as T value in assignment

错误是由于3.14(无类型浮点常量)不能总是分配给所有个可能实例[=] 23=],特别是 T 确实是 ~int.

游乐场,float64 标识符作为类型参数:https://gotipplay.golang.org/p/1EuAsSKdihK