@@ -304,29 +304,48 @@ func (v Value) Slice(i, j int) Value {
304304 panic ("unimplemented: (reflect.Value).Slice()" )
305305}
306306
307+ //go:linkname maplen runtime.hashmapLenUnsafePointer
308+ func maplen (p unsafe.Pointer ) int
309+
310+ //go:linkname chanlen runtime.chanLenUnsafePointer
311+ func chanlen (p unsafe.Pointer ) int
312+
307313// Len returns the length of this value for slices, strings, arrays, channels,
308- // and maps. For oter types, it panics.
314+ // and maps. For other types, it panics.
309315func (v Value ) Len () int {
310316 t := v .Type ()
311317 switch t .Kind () {
318+ case Array :
319+ return v .Type ().Len ()
320+ case Chan :
321+ return chanlen (v .value )
322+ case Map :
323+ return maplen (v .value )
312324 case Slice :
313325 return int ((* SliceHeader )(v .value ).Len )
314326 case String :
315327 return int ((* StringHeader )(v .value ).Len )
316- case Array :
317- return v .Type ().Len ()
318- default : // Chan, Map
319- panic ("unimplemented: (reflect.Value).Len()" )
328+ default :
329+ panic (& ValueError {"Len" })
320330 }
321331}
322332
333+ //go:linkname chancap runtime.chanCapUnsafePointer
334+ func chancap (p unsafe.Pointer ) int
335+
336+ // Cap returns the capacity of this value for arrays, channels and slices.
337+ // For other types, it panics.
323338func (v Value ) Cap () int {
324339 t := v .Type ()
325340 switch t .Kind () {
341+ case Array :
342+ return v .Type ().Len ()
343+ case Chan :
344+ return chancap (v .value )
326345 case Slice :
327346 return int ((* SliceHeader )(v .value ).Cap )
328- default : // Array, Chan
329- panic ("unimplemented: (reflect.Value). Cap()" )
347+ default :
348+ panic (& ValueError { " Cap" } )
330349 }
331350}
332351
0 commit comments