我需要进行一些安全的扩大整数转换 - 例如,
uint32
到uint
和uint
到uint64
。我知道可以通过显式类型转换来实现这一点:
x := uint32(1) // suppose
y := uint(x)
但是如果
x
的类型稍后发生变化,这将继续编译,同时做错误的事情。
x := int32(-1)
y := uint(x) // y is now 4294967295 or 18446744073709551615
x := uint64(4294967296)
y := uint(x) // y is now zero if uint is 32 bits
是否有一种惯用的方法来执行必须保留原始值或无法编译的整数转换?我能想到的最好的办法就是拥有一个像这样的函数包,这似乎不值得:
func Uint32ToUint(x uint32) uint {
return uint(x)
}
我不知道有什么非常干净的方法,但是如果您可能希望允许将多种不同类型强制转换为
uint
,那么不必为每个此类强制转换定义单独的函数,另一种选择是使用适当的类型集定义一个接口,然后定义一个仅为该集中的类型定义的通用函数:
type SafeToConvertToUInt interface {
uint | uint32 | uint64
}
func ToUInt[T SafeToConvertToUInt](x T) uint {
return uint(x)
}
[游乐场链接]