Почему [емкость] строка в [] строка не будет в Golang? - PullRequest
0 голосов
/ 26 марта 2020

Я использую Golang1.14.

Вот тестовый код.

package main

import "time"

func checkData(data interface{}) {
    if _, ok := data.([]string); ok {
        println("Assert true.")
    } else {
        println("Assert false.")
    }
}

func main() {
    var years [20]string
    for i := 0; i < 20; i++ {
        years[i] = string(time.Now().Year() - 10 + i)
    }
    checkData(years)

    foods := []string{"Fruit", "Grass", "Fish", "Meat"}
    checkData(foods)
}

Вывод:

Assert false.
Assert true.

Я новичок в Golang и действительно сбивает с толку, что [20]string не является []string. Может кто-нибудь сказать мне, почему? Спасибо.

1 Ответ

1 голос
/ 26 марта 2020

[20]string - это массив. Это тип, который содержит 20 строк, и если вы передадите его как интерфейс {}, вы можете восстановить его, используя intf.([20]string).

[]string. У него есть резервный массив, но это, по сути, вид на массив. Вы утверждаете, проверяет, является ли интерфейс слайсом, поэтому этот работает.

Массивы и слайсы - это разные вещи в Go. Массив - это тип данных с фиксированным размером. Например:

func f(arr [10]int) {...}

Вы можете вызвать f только с массивом int размером 10. Когда вы его вызовите, массив будет передан в качестве значения, поэтому функция получит копию массив, все 10 его членов. Но:

func f(arr []int) {...}

Вы можете позвонить f с любым размером среза. Срез содержит ссылку на свой базовый массив, поэтому копирование массива здесь не будет. Вы не можете вызвать this f` с массивом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...