繁体   English   中英

为什么 [capacity]string assert to []string 在 Golang 中会失败?

[英]Why [capacity]string assert to []string will be failed in Golang?

我正在使用 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 。有人能告诉我为什么吗?谢谢。

[20]string是一个数组。 它是一种包含 20 个字符串的类型,如果将其作为 interface{} 传递,则可以使用intf.([20]string)恢复它。

[]string是一个切片。 它有一个支持数组,但它本质上是一个数组视图。 你断言检查接口是否是一个切片,所以这个工作。

数组和切片在 Go 中是不同的东西。 数组是具有固定大小的数据类型。 例如:

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

您只能使用大小为 10 的 int 数组调用f 。当您调用它时,该数组将作为值传递,因此该函数将获得该数组的副本,包括它的所有 10 个成员。 但:

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

您可以使用任何大小的切片调用f 切片包含对其底层数组的引用,因此此处不会发生数组复制。 你不能用数组调用this f`。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM