为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
萧十郎 2022-05-23 16:33:46
我正在使用 Golang1.14。这是测试代码。package mainimport "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 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

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

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

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

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

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

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

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


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信