[英]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
}
筆記:
直接這樣做是不可能的,因為這不是一回事。
any
與interface{}
相同,每個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.