github.com/searKing/golang/go@v1.2.74/container/slice/of.go (about)

     1  // Copyright 2020 The searKing Author. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package slice
     6  
     7  import (
     8  	"reflect"
     9  )
    10  
    11  // Of returns a slice consisting of the elements.
    12  // obj: Accept Array、Slice、String(as []byte if ifStringAsRune else []rune)
    13  func Of(obj interface{}) []interface{} {
    14  	return of(obj)
    15  }
    16  
    17  type MapPair struct {
    18  	Key   interface{}
    19  	Value interface{}
    20  }
    21  
    22  //of is the same as Of
    23  func of(obj interface{}) []interface{} {
    24  	switch kind := reflect.ValueOf(obj).Kind(); kind {
    25  	default:
    26  		// element as a slice of one element
    27  		out := []interface{}{}
    28  		out = append(out, obj)
    29  	case reflect.Array, reflect.Slice:
    30  	case reflect.Map:
    31  		out := []interface{}{}
    32  		v := reflect.ValueOf(obj)
    33  		keys := v.MapKeys()
    34  		for _, k := range keys {
    35  			e := v.MapIndex(k)
    36  			pair := MapPair{
    37  				Key:   reflect.Indirect(k).Interface(),
    38  				Value: reflect.Indirect(e).Interface(),
    39  			}
    40  			out = append(out, pair)
    41  		}
    42  		return out
    43  	}
    44  
    45  	out := []interface{}{}
    46  	v := reflect.ValueOf(obj)
    47  	for i := 0; i < v.Len(); i++ {
    48  		out = append(out, v.Slice(i, i+1).Index(0).Interface())
    49  	}
    50  	return out
    51  }