为什么binary.Read()不适用于结构?

我是 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

我的代码有什么问题吗?


慕妹3146593
浏览 118回答 1
1回答

胡说叔叔

该错误说明了一切:您不能使用未导出的字段。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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go