Мне любопытно, почему Go неявно преобразует []T
в []interface{}
когда он неявно преобразует T
в interface{}
. Есть ли что-то нетривиальное в этом преобразовании, которое я пропускаю?
Пример:
func foo([]interface{}) { /* do something */ }
func main() {
var a []string = []string{"hello", "world"}
foo(a)
}
go build
жалуется
нельзя использовать (строку типа []) как интерфейс типа [] {} в аргументе функции
И если я попытаюсь сделать это явно, то же самое: b := []interface{}(a)
жалуется
невозможно преобразовать (строку типа []) в интерфейс типа [] {}
Таким образом, каждый раз, когда мне нужно сделать это преобразование (которое, кажется, очень много), я делал что-то вроде этого:
b = make([]interface{}, len(a), len(a))
for i := range a {
b[i] = a[i]
}
Есть ли лучший способ сделать это, или стандартные функции библиотеки, чтобы помочь с этими преобразованиями? Кажется глупым писать 4 дополнительные строки кода каждый раз, когда я хочу вызвать функцию, которая может принимать список, например, целые числа или строки.