go - 为什么 [容量] 字符串断言到 [] 字符串会在 Golang 中失败?

标签 go

我正在使用 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是一片。它有一个支持数组,但它本质上是一个数组 View 。你断言检查接口(interface)是否是一个 slice ,所以这个可以工作。

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

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

您只能调用f使用大小为 10 的 int 数组。当您调用它时,该数组将作为值传递,因此该函数将获取该数组的所有 10 个成员的副本。但:
func f(arr []int) {...}

您可以调用f任何大小的 slice 。 slice 包含对其底层数组的引用,因此此处不会发生数组副本。您不能调用 this f` 带有一个数组。

关于go - 为什么 [容量] 字符串断言到 [] 字符串会在 Golang 中失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60860436/

相关文章:

http - 戈朗 : Simultaneous function Calls for http post request

go - 使用反射确定类型是否为字符串

http - 释放未使用的内存?

复合结构的 JSON 编码(marshal)处理,均实现 MarshalJSON()

go - Aerospike 字符集 utf8 设置

mysql - 是否存在支持单个字符串中的多个语句的 Go Mysql 驱动程序?

go - 在 serveHTTP 处理程序中调用接口(interface)方法和结构方法有什么区别?

go - 对字段 X 的一般属性,存在于多种类型中

http - Go 中的简单 HTTP POST 文件上传

go - 检查我是否可以从 channel 读取