在返回 any 的函数内移动类型断言

问题描述 投票:0回答:1

我有以下通用 Go 函数的示例:

package main

func read(address uint16) any {

    switch address {
    case 1:
        return float64(0.5)
    case 2:
        return int(8)
    default:
        return "Hello"
    }

}

func main() {
    v1 := read(1)
    v2 := read(2)

    v1 = v1 / 2.5
    v2 = v2 * 4
}

由于缺少类型断言而失败。请参阅 go.dev/play.

上的代码

为了避免这种情况,我可以根据Go泛型教程使用类型断言:

v1 = v1.(float64) / 2.5
v2 = v2.(int) * 4

正确提供类型。但是,我想创建一个通用方法来读取传感器值。用户和编译器都知道如果调用

read(1)
然后返回一个float64,如果调用
read(2)
总是返回一个整数。

底线:有什么方法可以避免函数外的类型断言语法

read()

我能想到的唯一丑陋的方法是有不同的阅读功能,如

readInt()
readFloat64()
,但我宁愿保留一个通用的阅读方法。

go switch-statement any type-assertion
1个回答
2
投票

有什么办法可以避免函数 read() 之外的类型断言语法?

是的,使用泛型将类型断言移到函数内部。

func read[T any](address uint16) T {
    var result any
    switch address {
    case 1:
        result = float64(0.5)
    case 2:
        result = int(8)
    default:
        result = "Hello"
    }
    return result.(T)
}

func main() {
    v1 := read[float64](1)
    v2 := read[int](2)

    v1 = v1 / 2.5
    v2 = v2 * 4
    fmt.Println(v1, v2)
}
© www.soinside.com 2019 - 2024. All rights reserved.