1 回答

TA貢獻1834條經(jīng)驗 獲得超8個贊
您不能對聯(lián)合的近似項(如 )進行詳盡的類型轉(zhuǎn)換~[16]byte,因為定義設置的類型是未綁定的。您必須使用反射來提取數(shù)組類型并最終將其重新切片。
只有一個近似項
如果近似項~[16]byte在聯(lián)合中是唯一的,你可以在default塊中進行類型轉(zhuǎn)換和處理。這是基于類型參數(shù)的編譯時類型安全性,因此該default塊不會以任何意外類型運行:
func rewrittenFoo[T int | ~[16]byte](val T) {
switch t := any(val).(type) {
// handle all non-approximate type cases first
case int:
foo(t) // t is int
// this will be all other types in T's type set that are not int
// so effectively ~[16]byte
default:
v := reflect.ValueOf(t).Convert(reflect.TypeOf([16]byte{})).Interface().([16]byte)
foo(v[:])
}
}
游樂場:https ://go.dev/play/p/_uxmWGyEW5N
許多不同的近似項
如果聯(lián)合中有很多代字號,則不能依賴default大小寫。如果底層類型都不同,您可以打開reflect.Kind:
func rewrittenFoo[T int | ~float64 | ~[16]byte](val T) {
// handle all non-approximate type cases first
switch t := any(val).(type) {
case int:
foo(t)
}
switch reflect.TypeOf(val).Kind() {
case reflect.Float:
// ...
case reflect.Array:
// ...
}
}
許多相似的近似項
類型參數(shù)不會有太大幫助,只需使用any并詳盡地類型切換所有可能的類型。您可以將您知道具有相同基礎類型的類型分組,并使用Value#Convert如上所示 - 或特定于類型的方法(如Value#Int()或Value#String()-)來類似地處理它們。
- 1 回答
- 0 關注
- 113 瀏覽
添加回答
舉報