我无法解决如何将int
转换为包含complex128
的泛型类型。下面是一个例子,除非complex128
被注解掉,否则无法编译:
package main
import "fmt"
type val interface {
int64 | float64 | complex128
}
func f[V val](a, b V) (c V) {
q := calc()
return a * b * V(q)
}
func calc() int {
// lengthy calculation that returns an int
return 1
}
func main() {
fmt.Printf("%v\n", f(int64(1), int64(2)))
}
这是从一个更大的计算简化而来的。我尝试过使用开关,但我尝试的每种语法似乎都遇到了这样或那样的阻力。
如何将a
和b
与整数相乘?
我试过在返回变量的类型上使用一个开关,比如any(c).(type)
,但是例如,如果我有case complex128:
,那么它拒绝允许complex
内置,因为它不返回V
。
如果没有complex128
,上面的代码也可以编译。
2条答案
按热度按时间qcbq4gxm1#
这一个可以工作,但它需要列出
switch
语句中的每个类型:e4yzc0pl2#
如前所述,您的问题无法通过实际的泛型代码解决。联合中存在
complex128
排除了从int
到V
的干净转换。只有当转换对类型参数类型集中的所有类型都有效时,涉及类型参数的转换才有效,并且复杂类型不能转换为其他非复杂数值类型。语言规范指出
在以下任何情况下,非常量值x都可以转换为类型T:
[...]
整型和浮点型可以相互转换,但复杂类型不能。
因此泛型在这里不起作用。如果必须使用类型开关专门化函数以强制其工作,则最好根本不使用泛型。
请注意,该函数可以很好地处理无类型常量。它将被隐式转换为表达式所需的任何类型: