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?


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