Почему binary.Read () не работает для struct? - PullRequest
0 голосов
/ 02 октября 2019

Я новичок в 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 Ответ

3 голосов
/ 02 октября 2019

Ошибка говорит сама за себя: вы не можете использовать неэкспортированные поля. Измените поля 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...