这里有新用户。我有一部分这样的结构对象:
type TagRow struct { Tag1 string Tag2 string Tag3 string }
哪个切片像:
[{a b c} {d e f} {g h}]
我想知道如何将结果切片转换为类似字符串的切片:
["a" "b" "c" "d" "e" "f" "g" "h"]
我试图像这样迭代:
for _, row := range tagRows { for _, t := range row { fmt.Println("tag is" , t) }
}
但是我得到:
cannot range over row (type TagRow)
因此,感谢您的帮助。
对于您的特定情况,我将“手动”执行:
rows := []TagRow{ {"a", "b", "c"}, {"d", "e", "f"}, {"g", "h", "i"}, } var s []string for _, v := range rows { s = append(s, v.Tag1, v.Tag2, v.Tag3) } fmt.Printf("%q\n", s)
输出:
["a" "b" "c" "d" "e" "f" "g" "h" "i"]
如果希望它动态遍历所有字段,则可以使用该reflect程序包。一个辅助函数可以做到这一点:
reflect
func GetFields(i interface{}) (res []string) { v := reflect.ValueOf(i) for j := 0; j < v.NumField(); j++ { res = append(res, v.Field(j).String()) } return }
使用它:
var s2 []string for _, v := range rows { s2 = append(s2, GetFields(v)...) } fmt.Printf("%q\n", s2)
输出是相同的:
在Go Playground上尝试示例。