You are right Axel, I should be more clear on when one needs to overwrite that method with the same name as type (with the same name) (method B of type *B).
Sample: https://play.golang.org/p/rg5C_5Z5NhR (compiler error) Working example using type aliases: https://play.golang.org/p/PBHBvkSPUxW On Wednesday, February 28, 2018 at 11:00:13 PM UTC+3:30, Axel Wagner wrote: > > 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.sh...@gmail.com > <javascript:>> 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...@googlegroups.com <javascript:>. >> 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.