在不同类型的切片之间转换

[]byte从UDP套接字获取了一个字节片(),并希望将其视为整数片([]int32),而无需更改基础数组,反之亦然。在C(++)中,我只是在指针类型之间进行转换;我将如何在Go中执行此操作?


jeck猫
浏览 213回答 3
3回答

慕仙森

简短的答案是你做不到。Go不会让您将一种类型的切片转换为另一种类型的切片。您将在数组中循环,并在投射数组中的每个项目时创建所需类型的另一个数组。这通常被认为是一件好事,因为类型安全性是go的重要特征。

梦里花落0921

您可以执行C语言中的操作,但有一个例外-Go不允许从一种指针类型转换为另一种指针类型。可以,但是您必须使用unsafe.Pointer告诉编译器您知道所有规则均已违反,并且您知道自己在做什么。这是一个例子:package mainimport (    "fmt"    "unsafe")func main() {    b := []byte{1, 0, 0, 0, 2, 0, 0, 0}    // step by step    pb := &b[0]         // to pointer to the first byte of b    up := unsafe.Pointer(pb)    // to *special* unsafe.Pointer, it can be converted to any pointer    pi := (*[2]uint32)(up)      // to pointer to the first uint32 of array of 2 uint32s    i := (*pi)[:]           // creates slice to our array of 2 uint32s (optional step)    fmt.Printf("b=%v i=%v\n", b, i)    // all in one go    p := (*[2]uint32)(unsafe.Pointer(&b[0]))    fmt.Printf("b=%v p=%v\n", b, p)}显然,您应该谨慎使用“不安全”软件包,因为Go编译器不再握紧您的手-例如,您可以pi := (*[3]uint32)(up)在此处编写,并且编译器不会抱怨,但是您会遇到麻烦。而且,正如其他人已经指出的那样,uint32的字节在不同计算机上的布局可能有所不同,因此您不应假定它们是所需的布局。最安全的方法是一一读取字节数组,然后从中取出所需的任何内容。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go