当前位置: 首页 > 面试题库 >

如何在Go中将结构片段转换为字符串片段?

米俊晤
2023-03-14
问题内容

这里有新用户。我有一部分这样的结构对象:

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程序包。一个辅助函数可以做到这一点:

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)

输出是相同的:

["a" "b" "c" "d" "e" "f" "g" "h" "i"]

在Go Playground上尝试示例。



 类似资料:
  • 问题内容: 我正在尝试将切片的结构分配给切片(以传递到AppEngine的切片。但是,由于这两种类型显然不兼容,这会导致编译错误: 基本上我有: 反正是有复制到不复制一个-AT-A-时间每个元素? 问题答案: 您将不得不一次复制一次。没有办法解决。 如果有助于接受这一点,则应考虑以下事实:将结构包装在接口中实际上确实将其包装在内存级别。接口包含指向原始类型的指针和类型本身的描述符。将单个结构投射到

  • 问题内容: 目前,我目前正在处理一些代码,其中涉及类型为var的 它具有价值,我可以像这样轻松访问: 很好,但是我希望能够使用该 函数,由于它需要type 而不是type ,因此通常会出错。 可以使用该功能的最合适的解决方案是什么,我想也许是某种转换方法? 问题答案: 您需要构造一个新的type数组才能使用: 请参阅相关的Golang常见问题解答条目:我可以将[] T转换为[]接口{}吗?

  • 问题内容: 例如输入:(类型:) 转换示例:(类型:的切片) 问题答案: 除了mhutter的答案外,还请注意您的输入看起来像一个JSON数组(也许是来自JSON文本?)。 如果您这样处理,则可以将其内容编组为一个切片。直接解析其中的数字并不会更快(因为该包使用了反射),但是它肯定更简单: 输出(在Go Playground上尝试):

  • 问题内容: 我想将字符串切片转换为指向字符串的指针切片 %!p(string = a)=>字符串 %!p(string = b)=>字符串 %!p(string = c)=>字符串 [0xc42000e1d0 0xc42000e1d0 0xc42000e1d0] 据我了解, 我的变量似乎是一个字符串,而不是指向字符串的指针。 因此应从迭代时复制。 显然我不正确,因为地址仍然相同。如果值不是指针,该

  • 问题内容: s是“ E”,但我想要的是“ 123” 请告诉我如何获得“ 123”。 在Java中,我可以这样进行: 如何在Go中输入两个字符串? 问题答案: 使用包的功能。 例如: 您可以简单地通过添加字符串或使用包的功能来连接字符串。

  • 问题内容: 我有一个大小字节数组,做完之后。 我得到错误: 无法将b(类型[16] byte)转换为字符串类型 问题答案: 您可以将其称为切片: