簡體   English   中英

golang:你如何將一個未知類型的數組轉換為類型 []any?

[英]golang: How do you cast an array of unknown type to type []any?

假設只有數組作為參數傳遞給arr參數,我希望每次調用unpackArray()都返回從其原始數組類型轉換為類型[]any的參數。

package main

func unpackArray(arr any) []any {
    return arr.([]any)
}

func main() {
    myArr1 := []string {"Hey"}
    myArr2 := []int {60}
    unpackArray(myArr1)
    unpackArray(myArr2)
}

但是,此代碼會產生錯誤panic: interface conversion: interface {} is []string, not []interface {} 所以它不允許我將靜態類型不是類型[]any的接口轉換為類型[]any

所以,鑒於我知道arr的靜態類型是某種類型的數組,並且在不從any更改arr參數的初始化類型的情況下,如何使用此函數將arr轉換為類型[]any

(我遇到了同樣的地圖問題,我無法從任意地圖類型轉換為map[any]any類型,但我猜這個問題的解決方案類似於數組的解決方案。)

Go 沒有像這樣的內置“強制轉換”,但你可以編寫一個函數來完成它。

您可以使用反射將任意類型的切片轉換為 []any:

func unpackArray(s any) []any {
    v := reflect.ValueOf(s)
    r := make([]any, v.Len())
    for i := 0; i < v.Len(); i++ {
        r[i] = v.Index(i).Interface()
    }
    return r
}

您還可以在 Go 1.18 或更高版本中使用泛型:

func unpackArray[S ~[]E, E any](s S) []any {
    r := make([]any, len(s))
    for i, e := range s {
        r[i] = e
    }
    return r
}

筆記:

  • Go 不像其他一些語言那樣有“演員表”。 Go 有一些相關的類型斷言轉換特性。
  • 表達式arr.([]any)是一個類型斷言。 該表達式斷言接口arr中的具體值具有[]any類型。 該表達式不進行任何轉換。

直接這樣做是不可能的,因為這不是一回事。


anyinterface{}相同,每個interface{}都是雙指針(第一個是“元數據”/“類型信息”,第二個是指向原始數據的指針)。

如果你有[]uint{60, 42}你有一個切片,每個元素都是 8 字節(考慮到 64 位)。 所以,如果你強制它是[]any ,每個元素現在需要 16 個字節,這會破壞一切。 你可以使用unsafe來做到這一點。

“轉換”的唯一方法是復制信息,因此,您可以創建一個[]any的新切片,然后將每個值附加到該新切片中。


復制的一個例子是:

// You can edit this code!

package main

func unpackArray[T any](arr any) (r []any) {
    o := arr.([]T)
    r = make([]any, len(o))

    for i, v := range o {
        r[i] = any(v)
    }

    return r
}

func main() {
    myArr1 := []string{"Hey"}
    myArr2 := []int{60}
    unpackArray[string](myArr1)
    unpackArray[int](myArr2)
}

但是,這沒有多大意義,因為您可以通過另一種方式使用泛型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM