package ch import ( "reflect" ) func indirect(v reflect.Value) reflect.Value { switch v.Kind() { case reflect.Interface: return indirect(v.Elem()) case reflect.Ptr: return v.Elem() default: return v } } func indirectType(t reflect.Type) reflect.Type { if t.Kind() == reflect.Ptr { t = t.Elem() } return t } func sliceElemType(v reflect.Value) reflect.Type { elemType := v.Type().Elem() if elemType.Kind() == reflect.Interface && v.Len() > 0 { return indirect(v.Index(0).Elem()).Type() } return indirectType(elemType) }