1 回答

TA貢獻1858條經驗 獲得超8個贊
當前的類型推斷規則是明確的。不考慮如何使用返回值:
類型推斷是基于
類型參數列表
用已知類型參數初始化的替換映射 M,如果有的話
普通函數參數的(可能為空)列表(僅在函數調用的情況下)
從 Go 1.18 開始,可能會簡單地重寫您的函數以接受所需類型的參數;這也有不隱藏函數體內分配的好處:
func FromInterfaceSlice[T any](s []interface{}, dst []T) error {
if len(s) != len(dst) {
return errors.New("lengths don't match")
}
for i, v := range s {
vt, ok := v.(T)
if !ok {
return nil, fmt.Errorf("%v (type=%T) doesn't fit the target type %T", v, v, res)
}
dst[i] = vt
}
return nil
}
并傳入具有所需長度的目標切片:
func main() {
src := []interface{}{1, 2, 3}
m := make([]int, len(src))
_ = FromInterfaceSlice(src, m)
fmt.Println(m)
}
如果您不能或不想事先確定切片的長度,則只能進行顯式實例化:
var m []int
m, _ = FromInterfaceSlice[int]([]interface{}{1, 2, 3})
// ^^^ explicit type argument
此外,類型參數仍然無法通過:=簡寫聲明推斷出來:
// what is m???
m, err := FromInterfaceSlice([]interface{}{1, 2, 3})
- 1 回答
- 0 關注
- 127 瀏覽
添加回答
舉報