第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

golang 將內(nèi)存轉(zhuǎn)換為結(jié)構(gòu)體

golang 將內(nèi)存轉(zhuǎn)換為結(jié)構(gòu)體

Go
侃侃爾雅 2021-09-13 16:57:12
我正在將遺留代碼移植到 golang,代碼是高性能的,我在翻譯讀取共享內(nèi)存以供以后解析的程序的一部分時(shí)遇到了麻煩。在 c 中,我只是將內(nèi)存轉(zhuǎn)換為結(jié)構(gòu)并正常訪問(wèn)它。在 go 中實(shí)現(xiàn)相同結(jié)果的最有效和最慣用的方法是什么?
查看完整描述

1 回答

?
白豬掌柜的

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊

如果您想將字節(jié)數(shù)組轉(zhuǎn)換為結(jié)構(gòu)體,unsafe包可以為您完成。這是一個(gè)工作示例:


您可以通過(guò)這種方式使用的結(jié)構(gòu)字段類型存在限制。切片和字符串已失效,除非您的 C 代碼為相應(yīng)的切片/字符串標(biāo)頭生成完全正確的內(nèi)存布局,這不太可能。如果它只是固定大小的數(shù)組和類型,如 (u)int(8/16/32/64),下面的代碼可能就足夠了。否則,您將不得不手動(dòng)復(fù)制和分配每個(gè)結(jié)構(gòu)字段。


package main


import "fmt"

import "unsafe"


type T struct {

    A uint32

    B int16

}


var sizeOfT = unsafe.Sizeof(T{})


func main() {

    t1 := T{123, -321}

    fmt.Printf("%#v\n", t1)


    data := (*(*[1<<31 - 1]byte)(unsafe.Pointer(&t1)))[:sizeOfT]

    fmt.Printf("%#v\n", data)


    t2 := (*(*T)(unsafe.Pointer(&data[0])))

    fmt.Printf("%#v\n", t2)

}

請(qǐng)注意,(*[1<<31 - 1]byte)實(shí)際上并未分配此大小的字節(jié)數(shù)組。這是一個(gè)技巧,用于確??梢酝ㄟ^(guò)...[:sizeOfT]零件創(chuàng)建正確大小的切片。大小1<<31 - 1是 Go 中任何切片可以擁有的最大可能大小。至少這在過(guò)去是正確的。我不確定這仍然適用。無(wú)論哪種方式,您都必須使用這種方法來(lái)獲得正確大小的字節(jié)切片。


查看完整回答
反對(duì) 回復(fù) 2021-09-13
  • 1 回答
  • 0 關(guān)注
  • 193 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)