我有以下通用 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()
,但我宁愿保留一个通用的阅读方法。
有什么办法可以避免函数 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)
}