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

什么是错误“二进制。写:无效类型“是什么意思?

什么是错误“二进制。写:无效类型“是什么意思?

Go
慕码人8056858 2022-08-01 17:32:18
下面显示的代码,我创建了一个结构类型,并希望将其编码为二进制。但它显示错误,我读过一些类似的代码,但我找不到为什么我的代码不起作用?binary.Write: invalid type main.Stutype Stu struct {    Name string    Age int    Id int}func main()  {    s := &Stu{        Name: "Leo",        Age: 21,        Id: 1,    }    buf := new(bytes.Buffer)    err := binary.Write(buf, binary.BigEndian, s)    if err != nil{        fmt.Println(err)    }    fmt.Printf("%q\n", buf)}
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

简而言之:编码/二进制不能用于编码具有非固定大小的任意值。 就是这样的例子。引用自二进制。写():intstring


Write 将数据的二进制表示形式写入 w。数据必须是固定大小的值或固定大小的值的切片,或者是指向此类数据的指针。


请注意,如果删除该字段并将字段更改为 ,它将起作用:stringintint32


type Stu struct {

    Age int32

    Id  int32

}


func main() {

    s := &Stu{

        Age: 21,

        Id:  1,

    }


    buf := new(bytes.Buffer)

    err := binary.Write(buf, binary.BigEndian, s)

    if err != nil {

        fmt.Println(err)

    }

    fmt.Printf("%q\n", buf)

}

哪些输出(在Go Playground上尝试):


"\x00\x00\x00\x15\x00\x00\x00\x01"

如文档所示,要对复杂结构进行编码,请使用编码/gob。


使用以下内容进行编码和解码的示例:encoding/gob


buf := new(bytes.Buffer)

enc := gob.NewEncoder(buf)

if err := enc.Encode(s); err != nil {

    fmt.Println(err)

}

fmt.Printf("%v\n", buf.Bytes())


dec := gob.NewDecoder(buf)

var s2 *Stu

if err := dec.Decode(&s2); err != nil {

    fmt.Println(err)

}

fmt.Printf("%+v\n", s2)

哪些输出(在Go Playground上尝试):


[41 255 129 3 1 1 3 83 116 117 1 255 130 0 1 3 1 4 78 97 109 101 1 12 0 1 3 65 103 101 1 4 0 1 2 73 100 1 4 0 0 0 12 255 130 1 3 76 101 111 1 42 1 2 0]

&{Name:Leo Age:21 Id:1}


查看完整回答
反对 回复 2022-08-01
  • 1 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

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