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

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标签。有没有办法做到这一点?我已经尝试过上面的示例以及带有指针切片而不是指向切片的指针的示例。徒劳无功。


aluckdog
浏览 70回答 1
1回答

一只名叫tom的猫

语言规范允许在具有相同字段(忽略标签)的结构类型之间进行转换。因此,创建另一个切片(类型为[]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。
打开App,查看更多内容
随时随地看视频慕课网APP