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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在不反射的情況下將結(jié)構(gòu)轉(zhuǎn)儲到字節(jié)數(shù)組中?

如何在不反射的情況下將結(jié)構(gòu)轉(zhuǎn)儲到字節(jié)數(shù)組中?

Go
紫衣仙女 2021-04-27 22:45:59
我已經(jīng)找到了編碼/二進制包來處理它,但是它依賴于反射包,因此它不適用于未大寫(即未導出)的結(jié)構(gòu)字段。但是我花了一周的時間才發(fā)現(xiàn)這個問題,但我仍然有一個問題:如果不應(yīng)該導出結(jié)構(gòu)字段,如何將它們輕松轉(zhuǎn)儲為二進制數(shù)據(jù)?編輯:這是示例。如果將大寫的Datastruct字段大寫,則可以正常工作。但是Datastruct原本是一種抽象類型,所以我不想導出這些字段。package mainimport (    "fmt"    "encoding/binary"    "bytes")type Data struct {    id int32    name [16]byte}func main() {    d := Data{Id: 1}    copy(d.Name[:], []byte("tree"))    buffer := new(bytes.Buffer)    binary.Write(buffer, binary.LittleEndian, d)    // d was written properly    fmt.Println(buffer.Bytes())    // try to read...    buffer = bytes.NewBuffer(buffer.Bytes())    var e = new(Data)    err := binary.Read(buffer, binary.LittleEndian, e)    fmt.Println(e, err)}
查看完整描述

1 回答

?
嗶嗶one

TA貢獻1854條經(jīng)驗 獲得超8個贊

最好的選擇可能是使用gob包,并讓您的結(jié)構(gòu)實現(xiàn)GobDecoder和GobEncoder接口,以便對私有字段進行序列化和反序列化。


這將是安全,獨立于平臺且高效的。而且,您必須僅在具有未導出字段的結(jié)構(gòu)上添加這些GobEncode和GobDecode函數(shù),這意味著您不會使其余代碼雜亂無章。


func (d *Data) GobEncode() ([]byte, error) {

    w := new(bytes.Buffer)

    encoder := gob.NewEncoder(w)

    err := encoder.Encode(d.id)

    if err!=nil {

        return nil, err

    }

    err = encoder.Encode(d.name)

    if err!=nil {

        return nil, err

    }

    return w.Bytes(), nil

}


func (d *Data) GobDecode(buf []byte) error {

    r := bytes.NewBuffer(buf)

    decoder := gob.NewDecoder(r)

    err := decoder.Decode(&d.id)

    if err!=nil {

        return err

    }

    return decoder.Decode(&d.name)

}


func main() {

    d := Data{id: 7}

    copy(d.name[:], []byte("tree"))

    buffer := new(bytes.Buffer)

    // writing

    enc := gob.NewEncoder(buffer)

    err := enc.Encode(d)

    if err != nil {

        log.Fatal("encode error:", err)

    }

    // reading

    buffer = bytes.NewBuffer(buffer.Bytes())

    e := new(Data)

    dec := gob.NewDecoder(buffer)

    err = dec.Decode(e)

    fmt.Println(e, err)

}


查看完整回答
反對 回復 2021-05-17
  • 1 回答
  • 0 關(guān)注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

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