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

标签 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

我的代码有什么问题吗?

最佳答案

该错误说明了一切:您不能使用未导出的字段。更改要导出的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)
}

关于go - 为什么binary.Read()对struct不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58197122/

相关文章:

Go Telegram Bot API 从本地文件上传照片

go - 尝试为 IntelliJ IDEA 安装 Golang 插件时出错

inheritance - 一个结构是否可以扩展现有结构,同时保留所有字段?

c - C 中未命名的结构/union 有什么好处?

go - 使用 Go 将结构转换为 []byte

elasticsearch - 如何在 elasticsearch 中只存储有限数量的文档。

swift - 如何在 Swift 结构中定义 Firestore 引用类型

c++ - 在 C++ Primer 中使用 Struct 和 Vector 时出现错误 C2661

linux - 安装失败

c++ - 如何从 C++ 中的函数返回结构?