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.