On Tuesday, 29 December 2020 at 16:25:41 UTC axel.wa...@googlemail.com 
wrote:

> On Tue, Dec 29, 2020 at 4:37 PM Arnaud Delobelle <arn...@gmail.com> wrote:
>
>> Question 1: I *think* that the compiler has all the information necessary 
>> to implement type assertion to the Cont interface as I have, i.e. it knows 
>> only 3 types implement that interface, so could it not do the optimisation 
>> on my behalf?
>>
>  
>>
> Question 2: Or is it possible that other Go values can be made at runtime 
>> that would implement this interface but not be one of the three known types 
>> that implement it? 
>>
>
> Yes, re 2. `reflect` can create new types at runtime. AFAIK the 
> implementation for interface-type-assertions is basically to look it up in 
> a global hashmap, which is pre-seeded with compile-time known types and 
> then gets filled on each (successful) inteface-type-assertion with the 
> correct method tables. But, I'm handwaving.
>
> Under these assumptions, it might be *possible* to first check against the 
> statically known types and only fall back on the map if none of that 
> matches. But it doesn't seem 100% clear to me that that's always faster.
>
> I think concrete type-assertions will always be faster than interface 
> type-assertions though - for a concrete type-assertions, it's really just 
> comparing the two type-pointers and copying the value (which, in your case, 
> is a pointer itself), whereas for an interface type-assertion, the actual 
> method table must be assembled or looked up.
>
> But, here's a question: If `v.iface` always contains a `Cont` - at least 
> that's what I assume from the fact that you don't use a ,ok assertion - why 
> not just declare it as such, instead of `interface{}`?
>
>>
>>
It doesn't always contain a Cont.  Sometimes it should, which is why this 
function panics (programming error).  There is also TryCont() which returns 
a boolean as well and doesn't panic. 

-- 
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/d4cab7ff-30dc-4fdd-b656-c89aa7d1aa8dn%40googlegroups.com.

Reply via email to