Преобразование между типами структур с одинаковыми полями (игнорирование тегов) разрешено спецификацией языка.
Поэтому создайте еще один фрагмент (типа []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
.