2 回答

TA貢獻1906條經驗 獲得超10個贊
問題似乎是您試圖通過指向類型的指針而不是類型本身來實現通用。如果我們將指針移動到參數本身而不是類型參數上,它就可以工作。
解釋如下,但這是工作代碼:
func valueOrNil[T ~int | ~uint](value *T) T {
if value == nil {
var zero T
return zero
}
return *value
}
所以而不是這個(這是行不通的):
func valueOrNil[T *int | *uint](value T) any
你可以這樣做:
func valueOrNil[T int | uint](value *T) any
但是,您可能希望更進一步并處理基礎類型:
func valueOrNil[T ~int | ~uint](value *T) any
這將允許自定義類型與函數一起使用:
type Thing int
var thing Thing
println(valueOrNil(thing))
您可能要考慮的另一個方面是對返回類型也進行泛化。您可以使用相同的T參數來執行此操作。
例如:
func valueOrNil([T ~int | ~uint](value *T) T
但這意味著您需要更改部分實現。而不是這個:
if value == nil {
return nil
}
你可以這樣做:
if value == nil {
var zero T
return zero
}
- 2 回答
- 0 關注
- 108 瀏覽
添加回答
舉報