On Thu, Jan 6, 2022 at 8:59 AM 'Axel Wagner' via golang-nuts <golang-nuts@googlegroups.com> wrote: > > • From the definition of type elements, we can see that an embedded interface > type is a type element. Therefore, `any` is a type element. > • `any` is an alias for `interface{}`, therefore it is a type without any > type elements, therefore the set of its specific types is empty ("For an > interface with no type elements, 𝑆 is the empty set."). > • `interface{ int; any }` is a type with two type elements. "For an interface > with type elements, 𝑆 is the intersection of the specific types of its type > elements.". Intersecting with an empty set (the specific types of `any`) > gives an empty set > • Therefore, the set of specific types of `interface{ int; any }` is the > empty set.
That doesn't seem right. "any" is an interface type and writing "interface { any }" just embeds the empty interface, which has no effect. I think the spec is incorrect here (and gri already sent https://golang.org/cl/375799 for this). But maybe there is something else wrong with the description of specific types. Ian > On Thu, Jan 6, 2022 at 5:34 PM Jason Phillips <jasonryanphill...@gmail.com> > wrote: >> >> And by "first paragraph of the spec" I mean "first paragraph of the >> Structure of interfaces section of the spec". Apologies. >> >> On Thursday, January 6, 2022 at 11:11:45 AM UTC-5 Jason Phillips wrote: >>> >>> @Brian >>> >>> > interface{ int; m() } // [specific type] int (but type set is empty >>> > because int has no method m) >>> > interface{ int; any } // no specific types (intersection is empty) [even >>> > though the type set is not empty] >>> >>> As noted in the first paragraph of the spec, the set of specific types is >>> calculated by only considering type elements in the interface. Given that, >>> I think the spec note is wrong in the example being discussed. It should be >>> "int". Also, regardless of the answer, surely the specific types for >>> "interface{ int; m() }" and "interface{ int; any}" are always the same? >>> >>> On Thursday, January 6, 2022 at 10:37:55 AM UTC-5 tapi...@gmail.com wrote: >>>> >>>> On Thursday, January 6, 2022 at 11:19:40 PM UTC+8 tapi...@gmail.com wrote: >>>>> >>>>> On Thursday, January 6, 2022 at 9:40:52 PM UTC+8 tapi...@gmail.com wrote: >>>>>> >>>>>> On Thursday, January 6, 2022 at 8:35:06 PM UTC+8 Brian Candler wrote: >>>>>>> >>>>>>> No, the mistake is in your reading of the spec. You are complaining >>>>>>> about this line: >>>>>>> >>>>>>> interface{ int; any } // no specific types (intersection is empty) >>>>>>> >>>>>>> The spec makes it clear that: >>>>>>> 1. "any" is short for "interface {}" >>>>>>> 2. "interface {}" has no specific types >>>>>>> >>>>>> >>>>>> I think your logic mistake here is that the operands of the union and >>>>>> intersection operations are type sets, instead of specific types. >>>>> >>>>> >>>>> This conclusion is not very precise. More precisely, the operands of the >>>>> union and intersection operations >>>>> could be either type set or specific types, but interface types don't >>>>> participate in calculations of specific types. >>>> >>>> >>>> This is still not precise. More precisely speaking, in calculations of >>>> specific types, >>>> interface types don't participate in intersection operations, >>>> and only "any" (interface{}) is allowed to participate in union operations. >>>> The result of a union operation with any as an operand is a blank set. >>>> >>>>> >>>>> >>>>>> >>>>>> >>>>>>> >>>>>>> You are taking the intersection of the set of one type (int) with the >>>>>>> empty set, and therefore the result is the empty set. Exactly as the >>>>>>> comment says. >>>>>>> >>>>>>> On Thursday, 6 January 2022 at 11:47:52 UTC tapi...@gmail.com wrote: >>>>>>>> >>>>>>>> On Thursday, January 6, 2022 at 6:15:06 PM UTC+8 Brian Candler wrote: >>>>>>>>> >>>>>>>>> 1. interface { a;b } is intersection. The "Intersection" between two >>>>>>>>> sets means things which exist in both sets simultaneously. >>>>>>>>> 2. interface { a|b } is union. "Union" means a set of things which >>>>>>>>> which exist in set A or set B. >>>>>>>>> >>>>>>>>> Quoting from the spec: >>>>>>>>> "the predeclared type any is an alias for the empty interface." >>>>>>>>> "interface{} // no specific types" >>>>>>>>> "For an interface with type elements, 𝑆 is the intersection of the >>>>>>>>> specific types of its type elements." >>>>>>>>> >>>>>>>>> Can you see now? >>>>>>>> >>>>>>>> >>>>>>>> The explanation is as what I think. >>>>>>>> But what is your conclusion? Is it a mistake in spec? >> >> -- >> 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 on the web visit >> https://groups.google.com/d/msgid/golang-nuts/cda21095-d57e-4f9d-8853-4a6a7e683953n%40googlegroups.com. > > -- > 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 on the web visit > https://groups.google.com/d/msgid/golang-nuts/CAEkBMfGV9tfn%2BZfRKs%3DyX2uybnUfxWswRUHww%2B%2BdUQsvP%2B_4FA%40mail.gmail.com. -- 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 on the web visit https://groups.google.com/d/msgid/golang-nuts/CAOyqgcUR%2BXqb8sOo_nxtuphFeRMFX5KQmJLYxQ%2BuQPRMg1QfRA%40mail.gmail.com.