2 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
我只是nil用 if 語(yǔ)句檢查。這是合理的做法。不過(guò),如果您想探索替代方案,請(qǐng)繼續(xù)閱讀。
在 Go 1.18 中,您可以使用一個(gè)簡(jiǎn)單的通用函數(shù)來(lái)完成此操作:
func val[T any](v *T) T {
if v != nil {
return *v
}
return *new(T) // zero value of T
}
但是,這僅適用于 form 中的指針類型*T。Go 中還有其他類型具有nil零值并且不是指針?;蛘?,nil如果您將指針傳遞給此類類型(例如*[]int. 不幸的是,沒(méi)有一種方便的方法來(lái)為所有可能的可空類型1聲明約束。
在 Go 1.17 及以下版本中,如果已知可能的類型集,則可以使用類型開(kāi)關(guān),但必須斷言結(jié)果。這具有允許對(duì)可空類型進(jìn)行臨時(shí)初始化的次要優(yōu)勢(shì):
func val(v interface{}) interface{} {
switch t := v.(type) {
case *string:
if t != nil {
return *t
}
return ""
case *[]string:
if t != nil {
return *t
}
return []string{}
default:
panic("unexpected type")
}
}
或者只是使用反射,具有必須斷言返回或冒著nil再次返回的風(fēng)險(xiǎn)的相同限制:
func val(v interface{}) interface{} {
t := reflect.TypeOf(v)
if t == nil || t.Kind() != reflect.Ptr {
panic("invalid input")
}
rv := reflect.ValueOf(v)
if rv.IsNil() {
return reflect.Zero(rv.Type().Elem()).Interface()
}
return v
}
游樂(lè)場(chǎng):https ://go.dev/play/p/9dk0hWay90j
1:主要是因?yàn)檫@樣的約束必須捕獲映射類型的鍵和/或值類型,并決定在這些情況下(任意)返回什么。

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
我正在接受另一個(gè)答案,但這是我嘗試過(guò)的,顯然也適用于原語(yǔ)。
func Unwrap[T any](x *T) (r T) {
if x != nil {
r = *x
}
return
}
- 2 回答
- 0 關(guān)注
- 140 瀏覽
添加回答
舉報(bào)