Что означает ([] Конструктор)(ноль)
Я читал исходный код связующего программного обеспечения Middleware Alice и нашел выражение:
func New(constructors ...Constructor) Chain {
return Chain{append(([]Constructor)(nil), constructors...)}
}
У меня нет проблем с кодом, за исключением того, что я никогда не видел выражения ([]Slice)(nil)
до. У кого-нибудь есть какая-либо информация об этом выражении?
2 ответа
Автор Алисы здесь, просто случайно нажал на этот вопрос.:)
Другие ответы объясняют, что append(nil, ...)
делает - я использую его по всей библиотеке, чтобы скопировать фрагменты, которые передает пользователь.
Теперь Go не позволяет просто использовать append(nil, someElement)
потому что тип nil
неизвестно ([]Constructor)(nil)
кастинг nil
к типу []Constructor
чтобы избежать этого. Это преобразование типов, как, скажем, int64(123)
или же (*int)(nil)
,
Это минимальный пример, когда компилятор выдает ошибку из-за нетипизированного nil:
a := ([]int)(nil)
a = append(a, 1, 2, 3) // works fine, a is of type []int
var b []int
b = append(b, 1, 2, 3) // works fine, b is of type []int
c := nil
c = append(c, 1, 2, 3) // compiler error: the type of c is unknown
Копирует constructors
аргумент в новый срез, назначил его в поле в Chain
литерал, и возвращает новую структуру.
Это эквивалентно
func New(constructors ...Constructor) Chain {
var tmp []Constructor
tmp = append(tmp, constructors...)
return Chain{tmp}
}