【问题标题】:Convert variable of type *[]foo to *[]bar将 *[]foo 类型的变量转换为 *[]bar
【发布时间】:2020-02-01 12:42:08
【问题描述】:
type foo struct {
    Field1 int
    Field2 string
}

type bar struct {
    Field1 int
    Field2 string
}

func main() {
    x := foo{1, "Hello"}
    y := bar(x)

    a := [...]foo{x, x}
    b := a[:]

    c := (*[]bar)(&b)

    fmt.Println(x, y, a, b, c)
}

我想在两个相同的结构之间进行转换。主要是在两个结构体上使用不同的json标签。有没有办法做到这一点?我已经尝试了上面的示例以及使用指针切片而不是指向切片的指针的示例。没用。

【问题讨论】:

  • 试试这个:github.com/jinzhu/copier
  • 还要确保您真正理解使用指向切片的指针的原因。你几乎不需要这样的东西。

标签: pointers go struct slice


【解决方案1】:

语言规范允许在具有相同字段(忽略标签)的结构类型之间使用Converting。

所以创建另一个切片([]bar 类型),并使用一个简单的循环来填充它,将每个单独的 foo 转换为 bar:

foos := []foo{
    {1, "Hello"},
    {2, "Bye"},
}

bars := make([]bar, len(foos))
for i, f := range foos {
    bars[i] = bar(f)
}

fmt.Println(foos, bars)

在Go Playground 上试试。

请注意,因为我们正在分配结构值,所以是的,所有字段都被复制了。如果你不想复制整个结构,你可以使用指针:

foos := []*foo{
    {1, "Hello"},
    {2, "Bye"},
}

bars := make([]*bar, len(foos))
for i, f := range foos {
    bars[i] = (*bar)(f)
}

fmt.Println(foos, bars)
for i := range foos {
    fmt.Println(foos[i], bars[i])
}

这将输出(在Go Playground 上尝试):

[0x40a0e0 0x40a0f0] [0x40a0e0 0x40a0f0]
&{1 Hello} &{1 Hello}
&{2 Bye} &{2 Bye}

从输出中可以看出,foos 和 bars 切片中的指针是相同的,但第一个包含 *foo 类型的值,而后者包含 *bar 类型的值。

【讨论】:

  • 这是否涉及复制所有的 foo?我也可以用指针来做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多