Преобразовать переменную типа * [] foo в * [] bar - PullRequest
1 голос
/ 03 октября 2019
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 Ответ

2 голосов
/ 03 октября 2019

Преобразование между типами структур с одинаковыми полями (игнорирование тегов) разрешено спецификацией языка.

Поэтому создайте еще один фрагмент (типа []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.

...