我想将 []int64 的一部分转换为 []uint64,最有效和优雅的方法是什么?我只知道以下方式:
func convert(userIDs ...int64) []uint64 {
uIDs := make([]uint64, len(userIDs))
for index, uID := range userIDs {
uIDs[index] = uint64(uID)
}
fmt.Printf("%T, %vn", uIDs, uIDs)
return uIDs
}
如果不诉诸不安全,你就无法避免循环:
b := make([]uint64, len(a))
for i, v := range a {
b[i] = uint64(v)
}
有关更多信息/示例,请参阅此问题或此问题。如果你真的想使用不安全,那么b := *(*[]uint64)(unsafe.Pointer(&a))
会起作用(但我不建议使用它,除非你有令人信服的理由这样做(。
只有一种方法可以将一个切片转换为另一个切片,正如 Birits 所回答的那样。
除非您正在寻找强制转换方法:
1(不安全。指针投射*(*[]uint64)(unsafe.Pointer(&int64_slice))
2( 使用链接名杂注重新导入编辑的单行:
//go:linkname convert convert.Slice
func convert(userIDs []int64) []int64 {
return userIDs
}
//go:linkname ConvertSliceInt64ToUInt64 convert.Slice
func ConvertSliceInt64ToUInt64(userIDs ...int64) []uint64
https://play.golang.org/p/8b-yVL_Ps-c