Commit c00804c5 authored by Ian Lance Taylor's avatar Ian Lance Taylor

encoding/binary: document that Read requires exported struct fields

Add a test for the current behaviour.

Fixes #7482.

LGTM=adg
R=golang-codereviews, adg
CC=golang-codereviews
https://golang.org/cl/95160043
parent 0f52fdbf
...@@ -133,6 +133,7 @@ func (bigEndian) GoString() string { return "binary.BigEndian" } ...@@ -133,6 +133,7 @@ func (bigEndian) GoString() string { return "binary.BigEndian" }
// When reading into structs, the field data for fields with // When reading into structs, the field data for fields with
// blank (_) field names is skipped; i.e., blank field names // blank (_) field names is skipped; i.e., blank field names
// may be used for padding. // may be used for padding.
// When reading into a struct, all non-blank fields must be exported.
func Read(r io.Reader, order ByteOrder, data interface{}) error { func Read(r io.Reader, order ByteOrder, data interface{}) error {
// Fast path for basic types and slices. // Fast path for basic types and slices.
if n := intDataSize(data); n != 0 { if n := intDataSize(data); n != 0 {
......
...@@ -265,6 +265,30 @@ func TestBlankFields(t *testing.T) { ...@@ -265,6 +265,30 @@ func TestBlankFields(t *testing.T) {
} }
} }
// An attempt to read into a struct with an unexported field will
// panic. This is probably not the best choice, but at this point
// anything else would be an API change.
type Unexported struct {
a int32
}
func TestUnexportedRead(t *testing.T) {
var buf bytes.Buffer
u1 := Unexported{a: 1}
if err := Write(&buf, LittleEndian, &u1); err != nil {
t.Fatal(err)
}
defer func() {
if recover() == nil {
t.Fatal("did not panic")
}
}()
var u2 Unexported
Read(&buf, LittleEndian, &u2)
}
type byteSliceReader struct { type byteSliceReader struct {
remain []byte remain []byte
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment