...

Source file src/github.com/thoas/go-funk/map.go

Documentation: github.com/thoas/go-funk

     1  package funk
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  )
     7  
     8  // Keys creates an array of the own enumerable map keys or struct field names.
     9  func Keys(out interface{}) interface{} {
    10  	value := redirectValue(reflect.ValueOf(out))
    11  	valueType := value.Type()
    12  
    13  	if value.Kind() == reflect.Map {
    14  		keys := value.MapKeys()
    15  
    16  		length := len(keys)
    17  
    18  		resultSlice := reflect.MakeSlice(reflect.SliceOf(valueType.Key()), length, length)
    19  
    20  		for i, key := range keys {
    21  			resultSlice.Index(i).Set(key)
    22  		}
    23  
    24  		return resultSlice.Interface()
    25  	}
    26  
    27  	if value.Kind() == reflect.Struct {
    28  		length := value.NumField()
    29  
    30  		resultSlice := make([]string, length)
    31  
    32  		for i := 0; i < length; i++ {
    33  			resultSlice[i] = valueType.Field(i).Name
    34  		}
    35  
    36  		return resultSlice
    37  	}
    38  
    39  	panic(fmt.Sprintf("Type %s is not supported by Keys", valueType.String()))
    40  }
    41  
    42  // Values creates an array of the own enumerable map values or struct field values.
    43  func Values(out interface{}) interface{} {
    44  	value := redirectValue(reflect.ValueOf(out))
    45  	valueType := value.Type()
    46  
    47  	if value.Kind() == reflect.Map {
    48  		keys := value.MapKeys()
    49  
    50  		length := len(keys)
    51  
    52  		resultSlice := reflect.MakeSlice(reflect.SliceOf(valueType.Elem()), length, length)
    53  
    54  		for i, key := range keys {
    55  			resultSlice.Index(i).Set(value.MapIndex(key))
    56  		}
    57  
    58  		return resultSlice.Interface()
    59  	}
    60  
    61  	if value.Kind() == reflect.Struct {
    62  		length := value.NumField()
    63  
    64  		resultSlice := make([]interface{}, length)
    65  
    66  		for i := 0; i < length; i++ {
    67  			resultSlice[i] = value.Field(i).Interface()
    68  		}
    69  
    70  		return resultSlice
    71  	}
    72  
    73  	panic(fmt.Sprintf("Type %s is not supported by Keys", valueType.String()))
    74  }
    75  

View as plain text