So, if i do this:
//assign  some  var  to  interface  type
var  i  io.Reader  =  readerImpl
i.Read(buf)

the interface i's dynamic type infomation is filled by type deduction in 
compiling phase?

also the function table in itab field of interface implementation filling 
with the actually methods of readerImpl also happened in compiling phase? 

if so, this is kind of similar with C++ virtual functions? 


在 2017年4月30日星期日 UTC+8上午3:23:54,T L写道:
>
>
>
> On Saturday, April 29, 2017 at 9:56:20 PM UTC+8, feilengcui008 wrote:
>>
>> Hey, All
>>
>> I'm curious about what happened when map or slice is assigned to 
>> interface variables. 
>>
>> I know the interface implementation in go runtime is:
>> type iface struct{
>>     tab *itab
>>     data unsafe.Pointer
>> }
>> and the interface static and dynamic type infomation are stored in itab, 
>> when we use reflect.TypeOf or reflect.ValueOf, 
>> we can get the dynamic type infomation of this interface. 
>>
>> But it seems that the implementations of slice or map do not have the 
>> underline element type infomation, here is the map implementation:
>> // A header for a Go map.
>> type hmap struct {
>> count     int // # live cells == size of map.  Must be first (used by 
>> len() builtin)
>> flags     uint8
>> B         uint8  // log_2 of # of buckets (can hold up to loadFactor * 
>> 2^B items)
>> noverflow uint16 // approximate number of overflow buckets; see 
>> incrnoverflow for details
>> hash0     uint32 // hash seed
>>
>> buckets    unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.
>> oldbuckets unsafe.Pointer // previous bucket array of half the size, 
>> non-nil only when growing
>> nevacuate  uintptr        // progress counter for evacuation (buckets 
>> less than this have been evacuated)
>> overflow *[2]*[]*bmap
>> }
>>
>> So when we use reflect.TypeOf or reflect.ValueOf, the map variable will 
>> be transformed to interface{} and the empty interface will contains the 
>> type information of the map, how does this happen? where does the 
>> interface{} get the type information?
>>
>
> compiler knows what type the map/slice is.
>  
>
>>
>>
>> Thanks in advance.
>>
>

-- 
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.

Reply via email to