这可以: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}为什么包含不属于同一“类型组”的类型的约束会导致此错误,我应该如何处理?
1 回答
慕妹3242003
TA贡献1824条经验 获得超6个赞
这个语法:
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
- 1 回答
- 0 关注
- 120 浏览
添加回答
举报
0/150
提交
取消