将值文字分配给没有 运行 的泛型类型的结构字段进入 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
这很好:
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