您的Int 类型不是int 的别名,它是一个新类型,int 是它的基础类型。语言规范不支持/允许这种类型的转换。更具体地说,不允许将切片类型转换为元素类型不同的另一个切片类型。
安全的方式
如果您只需要[]Int 的[]int“视图”,“转换”的安全方法是创建[]Int 切片的副本,但类型为[]int,并使用for range 循环并将每个单独的元素从 Int 转换为 int 类型:
var c = []Int{1, 2}
x := make([]int, len(c))
for i, v := range c {
x[i] = int(v)
}
fmt.Println(x)
输出(在Go Playground 上试试):
[1 2]
不安全的方式
还有一种“不安全”的方式:
var c = []Int{1, 2}
var x []int = *(*[]int)(unsafe.Pointer(&c))
fmt.Println(x)
输出是一样的。在Go Playground 上试试这个。
这里发生的是c的地址(也就是&c)转换成unsafe.Pointer(所有指针都可以转换成这个),然后再转换成*[]int(unsafe.Pointer可以被转换为任何指针类型),然后这个指针被取消引用,它给出了一个[]int类型的值。在这种情况下它是安全的,因为[]Int 和[]int 的内存布局是相同的(因为Int 具有int 作为其底层类型),但一般情况下,应尽可能避免使用包unsafe .
如果Int 是“真”别名
请注意,如果 Int 是 int 的“真实”别名,则甚至不需要转换:
var c = []Int{1, 2}
var x []int = c
fmt.Println(x)
输出与上面相同(在Go Playground 上尝试)。之所以这样是因为写[]Int和写[]int是一样的,它们是同一种类型,所以你甚至不需要在这里转换。
使用切片类型
另请注意,如果您要创建一个以[]int 作为其基础类型的新类型,则可以使用类型转换:
type IntSlice = []int
func main() {
var c = IntSlice{1, 2}
var x []int = []int(c)
fmt.Println(x)
}
输出再次相同。在Go Playground 上试试这个。