我是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
我的代码有什么问题吗?
答案 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)
}