为什么binary.Read()对struct不起作用?

时间:2019-10-02 07:39:13

标签: go struct

我是golang的初学者

我的golang版本是1.13

我尝试如下使用binary软件包

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
)

type Coordinate struct {
    x float64
    y float64
    z float64
}

func (self Coordinate) String() string {
    return fmt.Sprintf("(%f,%f,%f)", self.x, self.y, self.z)
}

//not work
func test() {
    var point Coordinate = Coordinate{1, 2, 3}
    buf := bytes.Buffer{}
    binary.Write(&buf, binary.LittleEndian, &point)
    fmt.Println(point)
    fmt.Println(buf)

    p := new(Coordinate)
    //panic: reflect: reflect.flag.mustBeAssignable using value obtained using unexported field
    binary.Read(&buf, binary.LittleEndian, p)
    fmt.Println(p)
}

func main() {
    test()
    println("over")
}

我收到了这样的错误消息:

panic: reflect: reflect.flag.mustBeAssignable using value obtained using unexported field

我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:3)

错误说明了一切:您不能使用未导出的字段。更改要导出的Coordinate的字段:

type Coordinate struct {
    X float64
    Y float64
    Z float64
}

然后它将起作用,并输出(在Go Playground上尝试):

(1.000000,2.000000,3.000000)
{[0 0 0 0 0 0 240 63 0 0 0 0 0 0 0 64 0 0 0 0 0 0 8 64] 0 0}
(1.000000,2.000000,3.000000)
over

也永远不要忽略Go中的错误。 binary.Read()binary.Write()返回错误,请始终进行检查,例如:

if err := binary.Write(&buf, binary.LittleEndian, &point); err != nil {
    // Handle error, for brevity we just panic here:
    panic(err)
}

if err := binary.Read(&buf, binary.LittleEndian, p); err != nil {
    // Handle error, for brevity we just panic here:
    panic(err)
}