To clarify: When I say "make an argument" I mean "from the spec".
What I'm trying to explain is why the behaviour you show is in accordance with the spec. What Ian is trying to explain is additionally, why the spec says what it says (i.e. arguing why the specified behaviour is sensible). It would be helpful to know, which of these you are talking about. Do you disagree that the behaviour you show is in accordance with the spec? In that case, it would be helpful to have an argument based on the spec, not by analogy with other programs. That is, find a section of the spec that says the program should behave differently. Or are you arguing that the behaviour is confusing and the spec should be changed? That's a fair thing to ask and in that case, it obviously makes no sense to talk about what the spec says and I would yield back to Ian. On Fri, 28 Feb 2025 at 17:15, Axel Wagner <axel.wagner...@googlemail.com> wrote: > > > On Fri, 28 Feb 2025 at 16:52, cpu...@gmail.com <cpui...@gmail.com> wrote: > >> Thank you Axel for quoting the spec. >> >> On Thursday, February 27, 2025 at 10:55:58 PM UTC+1 Axel Wagner wrote: >> >> > For a value x of type T or *T where T is not a pointer or interface >> type, x.f denotes the field or method *at the shallowest depth* in T >> where there is such an f. If there is not exactly one f with shallowest >> depth, the selector expression is illegal. >> >> The field `meter.EqualName` has a more shallow depth than >> `meter.EqualName.EqualName`, thus `m.EqualName` denotes the field, not the >> method. >> Thus, the method is not promoted. Thus `meter` has no `EqualName` method, >> as the only way it could get one is by promotion. >> >> >> I can see why the EqualName method is not promoted. However, there is >> still the EqualName field. Even if it's not useful (since zero value) I >> would expect this fields to make meter implement the EqualName interface. >> See https://play.golang.com/p/awtbP1X93Pg for an example that shows that >> presence of an interface field is enough. >> > > The two situations are not the same. Again, the salient question is "what > is the shallowest depth b, that a.b could refer to?". That is what `a.b` > means. And a method `b` is promoted to `a`, if `a.b` refers to a method. > In this new example, `new(s).Foo` refers to the shallowest depth method or > field `Foo`, which is `s.iface.Foo`, which is a method, so it is promoted. > If `s` also had a field `Foo`, then `new(s).Foo` would refer to that field > (as it is is at a shallower depth) and there is no method: > https://play.golang.com/p/OFYNiB98qyJ > That's your original example: `m.EqualName` refers to `meter.EqualName`, > not `meter.EqualName.EqualName`. So it refers to a field, not a method, so > no method is promoted. > > The spec is really clear on this regard. First you decide what the > selector refers to. And that decides whether a method is promoted. Full > stop. > > If you want to make an argument that `meter` should have a method > `EqualName` you need to actually say where it is coming from. Given that > you do not declare a method `func (meter) EqualName`, it could only get > that method via promotion. But the definition of promotion of methods > clearly says that no promotion is happening. > > >> >> Thanks, >> Andi >> >> -- >> 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. >> To view this discussion visit >> https://groups.google.com/d/msgid/golang-nuts/b4d16a1e-1c31-4cbb-8774-fc7b9d960d5fn%40googlegroups.com >> <https://groups.google.com/d/msgid/golang-nuts/b4d16a1e-1c31-4cbb-8774-fc7b9d960d5fn%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- 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. To view this discussion visit https://groups.google.com/d/msgid/golang-nuts/CAEkBMfGM0Ey%3D8HVkwuMYuTB2%3DkLbx_f4QPeqmGPASYVCEfyw%2Bg%40mail.gmail.com.