¿Cómo vuelco la estructura en la matriz de bytes sin reflexión?

Ya encontrécodificación / binario paquete para tratar con él, pero dependía dereflejar paquete, por lo que no funcionó con campos de estructura no capitalizados (es decir, no exportados). Sin embargo, pasé una semana para encontrar el problema, todavía tengo una pregunta: si los campos de estructura no deberían exportarse, ¿cómo los vuelco fácilmente en datos binarios?

EDITAR: Aquí está el ejemplo. Si escribe con mayúscula el nombre de los campos deData estructura, que funciona correctamente. PeroData La intención de struct era ser de tipo abstracto, por lo que no quiero exportar estos campos.

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

type Data struct {
    id int32
    name [16]byte
}


func main() {
    d := Data{Id: 1}
    copy(d.Name[:], []byte("tree"))
    buffer := new(bytes.Buffer)
    binary.Write(buffer, binary.LittleEndian, d)
    // d was written properly
    fmt.Println(buffer.Bytes())
    // try to read...
    buffer = bytes.NewBuffer(buffer.Bytes())
    var e = new(Data)
    err := binary.Read(buffer, binary.LittleEndian, e)
    fmt.Println(e, err)
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta