[20]string
- это массив. Это тип, который содержит 20 строк, и если вы передадите его как интерфейс {}, вы можете восстановить его, используя intf.([20]string)
.
[]string
. У него есть резервный массив, но это, по сути, вид на массив. Вы утверждаете, проверяет, является ли интерфейс слайсом, поэтому этот работает.
Массивы и слайсы - это разные вещи в Go. Массив - это тип данных с фиксированным размером. Например:
func f(arr [10]int) {...}
Вы можете вызвать f
только с массивом int размером 10. Когда вы его вызовите, массив будет передан в качестве значения, поэтому функция получит копию массив, все 10 его членов. Но:
func f(arr []int) {...}
Вы можете позвонить f
с любым размером среза. Срез содержит ссылку на свой базовый массив, поэтому копирование массива здесь не будет. Вы не можете вызвать this
f` с массивом.