12345678910111213141516171819202122232425262728293031323334353637 |
- // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
- //
- // This Source Code Form is subject to the terms of the MIT License.
- // If a copy of the MIT was not distributed with this file,
- // You can obtain one at https://github.com/gogf/gf.
- package gutil
- import (
- "github.com/gogf/gf/util/gconv"
- "reflect"
- )
- // StructToSlice converts struct to slice of which all keys and values are its items.
- // Eg: {"K1": "v1", "K2": "v2"} => ["K1", "v1", "K2", "v2"]
- func StructToSlice(data interface{}) []interface{} {
- var (
- reflectValue = reflect.ValueOf(data)
- reflectKind = reflectValue.Kind()
- )
- for reflectKind == reflect.Ptr {
- reflectValue = reflectValue.Elem()
- reflectKind = reflectValue.Kind()
- }
- switch reflectKind {
- case reflect.Struct:
- array := make([]interface{}, 0)
- // Note that, it uses the gconv tag name instead of the attribute name if
- // the gconv tag is fined in the struct attributes.
- for k, v := range gconv.Map(reflectValue) {
- array = append(array, k)
- array = append(array, v)
- }
- return array
- }
- return nil
- }
|