簡體   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