为了账号安全,请及时绑定邮箱和手机立即绑定

将 *[]foo 类型的变量转换为 *[]bar

将 *[]foo 类型的变量转换为 *[]bar

Go
aluckdog 2023-07-26 17:45:23
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标签。有没有办法做到这一点?我已经尝试过上面的示例以及带有指针切片而不是指向切片的指针的示例。徒劳无功。
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

语言规范允许在具有相同字段(忽略标签)的结构类型之间进行转换。

因此,创建另一个切片(类型为[]bar),并使用一个简单的循环来填充它,将每个个体转换foobar

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



查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信