Мені цікаво , чому Go does't неявно перетворити []T
в []interface{}
коли він буде неявно перетворити T
в interface{}
. Чи є щось нетривіальне в цьому перетворенні, чого я пропускаю?
Приклад:
func foo([]interface{}) { /* do something */ }
func main() {
var a []string = []string{"hello", "world"}
foo(a)
}
go build
скаржиться
не може використовувати рядок (type []) як інтерфейс type [] {} в аргументі функції
І якщо я спробую це зробити явно, те саме: b := []interface{}(a)
скаржиться
не може конвертувати (type [] рядок) у тип [] інтерфейсу {}
Тому щоразу, коли мені потрібно робити це перетворення (яке, здається, виникає багато), я робив щось подібне:
b = make([]interface{}, len(a), len(a))
for i := range a {
b[i] = a[i]
}
Чи є кращий спосіб зробити це, або стандартні функції бібліотеки, щоб допомогти у цих перетвореннях? Дуже нерозумно писати 4 зайвих рядки коду кожного разу, коли я хочу викликати функцію, яка може взяти список, наприклад, ints або string.