@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/bd5b6350-dbbf-4468-b648-f4b497c856ccn%40googlegroups.com.