为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

3 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-05-17
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

您可以执行C语言中的操作,但有一个例外-Go不允许从一种指针类型转换为另一种指针类型。可以,但是您必须使用unsafe.Pointer告诉编译器您知道所有规则均已违反,并且您知道自己在做什么。这是一个例子:


package main


import (

    "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的字节在不同计算机上的布局可能有所不同,因此您不应假定它们是所需的布局。


最安全的方法是一一读取字节数组,然后从中取出所需的任何内容。


查看完整回答
反对 回复 2021-05-17
  • 3 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信