[英]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.