Thanks a lot!

在 2017年4月30日星期日 UTC+8下午1:45:26,T L写道:
>
>
>
> On Sunday, April 30, 2017 at 10:54:07 AM UTC+8, feilengcui008 wrote:
>>
>> 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?
>>
>
> yes
>  
>
>>
>> also the function table in itab field of interface implementation filling 
>> with the actually methods of readerImpl also happened in compiling phase? 
>>
>
> compiler can, but this is done at run time.
>  
>
>>
>> if so, this is kind of similar with C++ virtual functions? 
>>
>
> yes, I think so.
>  
>
>>
>>
>> 在 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