Go 将结构的切片转换为字符串的二维切片

Go 将结构的切片转换为字符串的二维切片,go,Go,我想从数据库中获取数据并写入excel 假设我有一个结构,比如: 类型用户结构{ ID int64 名称字符串 年龄智力 } 我可以从DB&[]user{} 但是我想将该片段转换为字符串的2D片段[]string{} 下面是我的代码,请尝试执行此任务: func-toString(片接口{})[]字符串{ 开关reflect.TypeOf(slice.Elem().Kind()){ case reflect.Slice: ret:=[]字符串{} val:=reflect.ValueOf(sl

我想从数据库中获取数据并写入excel

假设我有一个结构,比如:

类型用户结构{
ID int64
名称字符串
年龄智力
}
我可以从DB
&[]user{}

但是我想将该片段转换为字符串的2D片段
[]string{}

下面是我的代码,请尝试执行此任务:

func-toString(片接口{})[]字符串{
开关reflect.TypeOf(slice.Elem().Kind()){
case reflect.Slice:
ret:=[]字符串{}
val:=reflect.ValueOf(slice.Elem())
对于i:=0;i
但是从上面的代码中,我得到的是一个类似
[]

我哪里做错了


我的代码在

对不起,我发现哪里做错了,我的
tempV
做错了

func-toString(片接口{})[]字符串{
开关reflect.TypeOf(slice.Elem().Kind()){
case reflect.Slice:
ret:=[]字符串{}
val:=reflect.ValueOf(slice.Elem())
对于i:=0;i
问题代码中有两个问题。第一个问题是slice元素被表达式
reflect.Value(val.Index(i))
中的一个reflect.Value双重包装。通过删除reflect.Value的额外调用进行修复。第二个问题是,该方法没有将基础值转换为其字符串表示形式。使用fmt.Sprint(或它的一个朋友)来实现这一点

试试这个:

func toStrings(slice interface{}) [][]string {
    // Get reflect value for slice. Use Indirect to
    // handle slice argument and pointer to slice
    // argument.
    v := reflect.Indirect(reflect.ValueOf(slice))
    if v.Kind() != reflect.Slice {
        return nil
    }

    var result [][]string

    // For each element...
    for i := 0; i < v.Len(); i++ {

        // Get reflect value for slice element (a struct). Use
        // Indirect to handle slice of struct and slice of
        // pointer to struct.
        e := reflect.Indirect(v.Index(i))
        if e.Kind() != reflect.Struct {
            return nil
        }

        // Convert fields to string and append.
        var element []string
        for i := 0; i < e.NumField(); i++ {
            // Use fmt.Sprint to convert arbitrary Go value
            // to a string.
            element = append(element, fmt.Sprint(e.Field(i).Interface()))
        }

        result = append(result, element)
    }
    return result
}
func-toString(片接口{})[]字符串{
//获取切片的反射值。使用间接
//句柄slice参数和指向slice的指针
//争论。
v:=反射间接(反射值(切片))
如果v.Kind()!=reflect.Slice{
归零
}
var结果[]字符串
//对于每个元素。。。
对于i:=0;i

.

也许我有一个简单的方法来解决这个问题

我使用
encoding/json
转换为json数据,然后将其转换为map[string]接口{}

func-toStrings2(片接口{})[]字符串{
jsonData,:=json.Marshal(切片)
var out[]映射[string]接口{}
_=json.Unmarshal(jsonData,&out)
变量字段[]字符串
如果len(out)>0{
对于k:=范围外[0]{
字段=追加(字段,k)
}
}
var ret[][]字符串
对于_,行:=范围外{
var r[]字符串
对于uk:=范围字段{
r=append(r,fmt.Sprint(行[k]))
}
ret=追加(ret,r)
}
回程网
}
注意:


在@CeriseLimón的帮助下,我知道这个答案中的代码无法处理User.ID的大值。

Post a。特别是,显示一个调用函数的示例、实际结果和预期结果。@CeriseLimón抱歉,我提供了golang PlayGround此答案中的代码不处理User.ID的大值。一个不起作用的示例是User.ID=9223372036854775807。