如何在Go语言中将int转换为包含complex128的泛型类型?

gajydyqb  于 2023-06-03  发布在  Go
关注(0)|答案(2)|浏览(254)

我无法解决如何将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)))
}

这是从一个更大的计算简化而来的。我尝试过使用开关,但我尝试的每种语法似乎都遇到了这样或那样的阻力。
如何将ab与整数相乘?
我试过在返回变量的类型上使用一个开关,比如any(c).(type),但是例如,如果我有case complex128:,那么它拒绝允许complex内置,因为它不返回V
如果没有complex128,上面的代码也可以编译。

qcbq4gxm

qcbq4gxm1#

这一个可以工作,但它需要列出switch语句中的每个类型:

func f[V val](a, b V) (c V) {
    q := calc()

    var temp any
    switch any(c).(type) {
    case complex128:
        temp = complex(float64(q), 0)
    case int64:
        temp = int64(q)
    default:
        temp = float64(q)
    }
    return a * b * (temp.(V))
}
e4yzc0pl

e4yzc0pl2#

如前所述,您的问题无法通过实际的泛型代码解决。联合中存在complex128排除了从intV的干净转换。
只有当转换对类型参数类型集中的所有类型都有效时,涉及类型参数的转换才有效,并且复杂类型不能转换为其他非复杂数值类型。语言规范指出
在以下任何情况下,非常量值x都可以转换为类型T:
[...]

  • x的类型和T都是整数或浮点类型。
  • x的类型和T都是复杂类型。

整型和浮点型可以相互转换,但复杂类型不能。
因此泛型在这里不起作用。如果必须使用类型开关专门化函数以强制其工作,则最好根本不使用泛型。
请注意,该函数可以很好地处理无类型常量。它将被隐式转换为表达式所需的任何类型:

func f[V val](a, b V) (c V) {
    return a * b * 1
}

相关问题