понедельник, 11 февраля 2019 г.

Go FAQ: преобразования срезов

Могу ли я преобразовать []T в []interface{}?

Не напрямую. Это запрещено в спецификации языка, потому что два типа не имеют одинакового представления в памяти. Необходимо скопировать элементы индивидуально в целевой срез. В следующем примере преобразуется срез int в срез interface{}:

t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
    s[i] = v
}

Могу ли я преобразовать []T1 в []T2, если T1 и T2 имеют одинаковый базовый тип?

Последняя строка этого примера кода не компилируется.

type T1 int
type T2 int
var t1 T1
var x = T2(t1) // OK
var st1 []T1
var sx = ([]T2)(st1) // не OK, не компилируется

В Go типы тесно связаны с методами, так как каждый именованный тип имеет (возможно, пустой) набор методов. Общее правило заключается в том, что вы можете изменить имя преобразованного типа (и, следовательно, возможно, изменить свой набор методов), но вы не можете изменить имя (и набор методов) элементов составного типа. Go требует, чтобы вы были явными о преобразованиях типов.


Читайте также:


Комментариев нет:

Отправить комментарий