栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

正如其他人所说,在Go中强制转换指针被认为是错误的形式。这是正确的Go方式示例以及与C数组转换等效的示例。

警告:所有代码未经测试。

正确的方式

在此示例中,我们使用

encoding/binary
包将每组4个字节转换为
int32
。这样更好,因为我们指定了字节序。我们也没有使用
unsafe
包破坏类型系统。

import "encoding/binary"const SIZEOF_INT32 = 4 // bytesdata:= make([]int32, len(raw)/SIZEOF_INT32)for i := range data {    // assuming little endian    data[i] = int32(binary.LittleEndian.Uint32(raw[i*SIZEOF_INT32:(i+1)*SIZEOF_INT32]))}

错误的方式(C数组转换)

在此示例中,我们告诉Go忽略类型系统。这不是一个好主意,因为它可能会在Go的另一个实现中失败。它假定的事情不在语言规范中。但是,此版本不做完整副本。此代码使用不安全的方式访问所有切片中常见的“
SliceHeader”。标头包含指向数据(C数组),长度和容量的指针。首先,我们需要更改长度和容量,而不仅仅是将标头转换为新的slice类型,因为如果将字节视为新类型,则元素数量会减少。

import (    "reflect"    "unsafe")const SIZEOF_INT32 = 4 // bytes// Get the slice headerheader := *(*reflect.SliceHeader)(unsafe.Pointer(&raw))// The length and capacity of the slice are different.header.Len /= SIZEOF_INT32header.Cap /= SIZEOF_INT32// Convert slice header to an []int32data:= *(*[]int32)(unsafe.Pointer(&header))


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381670.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号