利用reflect包把struct转[]string

项目中,在使用sdk调用链码的时候,传参使用的是[]struct类型,要把n个结构体中的n个字段都手动转成[]string是个体力活,因此写了一个公共方法。

package main

import (
   "fmt"
   "reflect"
   "strconv"
)

type Student struct {
   Name    string
   Age     int
   Sex     int64
   Address string
}

func main() {
   s := Student{
      Name:    "小明",
      Age:     20,
      Address: "上海市",
      Sex:     1,
   }

   st := struct2strings(s)
   fmt.Println(len(st), st)
}

func struct2strings(i interface{}) []string {

   value := reflect.ValueOf(i)
   //fmt.Println(value.NumField())
   var res = make([]string, 0, value.NumField())
   for j := 0; j < value.NumField(); j++ {
      var v string
      switch value.Field(j).Kind() {
      case reflect.Int:
         v = strconv.FormatInt(value.Field(j).Int(), 10)
      case reflect.Int64:
         v = strconv.FormatInt(value.Field(j).Int(), 10)
      case reflect.String:
         v = value.Field(j).String()
      }
      res = append(res, v)
   }
   return res
}

由于项目中只使用到了Int,Int64,string三种类型,因此没有把别的类型兼容进去。


转载请注明来源

×

喜欢就点赞,疼爱就打赏