This is a bug that has been fixed on Go tip by https://go-review.googlesource.com/c/go/+/65550.
On 23 January 2018 at 00:45, Josh Humphries <jh...@bluegosling.com> wrote: > I think have misspoken. Even though the field's name appears exported via > reflection (it has a name that starts with a capital letter), attempting to > use the reflect.Value's SetInt method panics, indicating that the field was > obtained using an unexported field. So the encoding/json package is thus > consistent with that in that it ignores unexported fields. > > It is still not obvious from the spec what should be happening. I would > expect it to be exported due to the resolved field name. But if it is > unexported because the compiler resolves the alias first, then I would > expect a compiler error because the four fields all resolve to the same > name. The spec states this is not allowed: > > The following declaration is illegal because field names must be unique in a > struct type: > > struct { > T // conflicts with embedded field *T and *P.T > *T // conflicts with embedded field T and *P.T > *P.T // conflicts with embedded field T and *T > } > > So it is possible that this is not a bug in the encoding/json package but in > the compiler. > > ---- > Josh Humphries > jh...@bluegosling.com > > On Mon, Jan 22, 2018 at 7:28 PM, Josh Humphries <jh...@bluegosling.com> > wrote: >> >> I think that is expected, and it is the JSON marshaling that is surprising >> (and erroneous). >> >> If it were expected that the embed field names resolved to the alias >> target type name, it would instead be a compiler error since the compiler >> does not allow embedded types that would result in name collisions. Using >> reflection, one can see the fields are named just as in your example, after >> the type aliases, not its underlying type name. The bug is that JSON >> marshaling is not looking at the field name and instead looking directly at >> the field type name (which, in this case, has been resolved to int). >> >> ---- >> Josh Humphries >> jh...@bluegosling.com >> >> On Mon, Jan 22, 2018 at 5:58 PM, Dan Kortschak >> <dan.kortsc...@adelaide.edu.au> wrote: >>> >>> This is sort of surprising though: https://play.golang.org/p/mjfkzIqAo_b >>> >>> On Mon, 2018-01-22 at 10:20 -0800, C Banning wrote: >>> > From the Language Specification - >>> > >>> > A field declared with a type but no explicit field name is called an >>> > *embedded >>> > field*. An embedded field must be specified as a type name T or as a >>> > pointer to a non-interface type name *T, and T itself may not be a >>> > pointer >>> > type. The unqualified type name acts as the field name. >>> > >>> > // A struct with four embedded fields of types T1, *T2, P.T3 and >>> > *P.T4 >>> > struct { >>> > T1 // field name is T1 >>> > *T2 // field name is T2 >>> > P.T3 // field name is T3 >>> > *P.T4 // field name is T4 >>> > x, y int // field names are x and y >>> > } >>> > >>> > >>> > From the encoding/json#Marshal documentation - >>> > >>> > Struct values encode as JSON objects. Each exported struct field >>> > becomes a >>> > member of the object, using the field name as the object key, unless >>> > the >>> > field is omitted for one of the reasons given below. >>> > >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send an >>> email to golang-nuts+unsubscr...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >> >> > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.