Что означает ([] Конструктор)(ноль)

Я читал исходный код связующего программного обеспечения 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}
}
Другие вопросы по тегам