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
),并使用一个简单的循环来填充它,将每个个体转换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
。
- 1 回答
- 0 关注
- 95 浏览
添加回答
举报
0/150
提交
取消