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