Can you elaborate/link to example code? Because it seems to work just fine <https://play.golang.org/p/P0gUjbf6qRD>.
On Wed, Feb 28, 2018 at 6:58 PM Kaveh Shahbazian <kaveh.shahbaz...@gmail.com> wrote: > BTW I have found an interesting usage for embedding type aliases. Assume a > type A embeds another type B that has a member named B. That will cause a > compilation error since A has two members named B. Now if a type alias be > defined as type OrigB = B, then A can embed OrigB without any problems. > > On Tuesday, January 23, 2018 at 9:59:10 PM UTC+3:30, Kaveh Shahbazian > wrote: >> >> Did not try that and changed that instance of this code. >> >> On Tuesday, January 23, 2018 at 9:04:36 PM UTC+3:30, rog wrote: >>> >>> Have you tried out the behaviour on Go tip (or the go 1.10 beta)? >>> >>> On 23 Jan 2018 14:31, "Josh Humphries" <j...@fullstory.com> wrote: >>> >>> Roger, >>> I don't believe that patch will change behavior. See my last message: >>> the fields appear to be unexported according to reflection. >>> >>> That patch has the encoding/json package checking StructField.PkgPath, >>> which should be blank for exported fields. For these fields, it is >>> "go.builtin", which appears to be a pseudo-package name for builtins >>> (interestingly, it's not just "builtin" which is what Go doc would lead one >>> to expect). That means it will behave the same and skip the three fields in >>> question. >>> >>> This is non-intuitive based on the language spec, since the field names >>> are upper-cased. I think this is either a bug in reflect -- which should >>> set StructField.PkgPath to "" since the field name is exported -- OR a bug >>> in the compiler which should complain that there are three fields whose >>> resolved name appears to be the unexported identifier "int". >>> >>> >>> ---- >>> >>> Josh Humphries >>> >>> FullStory <https://www.fullstory.com/> | Atlanta, GA >>> >>> Software Engineer >>> >>> j...@fullstory.com >>> >>> On Tue, Jan 23, 2018 at 3:44 AM, roger peppe <rogp...@gmail.com> wrote: >>> >>>> 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.ko...@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...@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...@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.