亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go中如何獲取指針類型的底層值?

Go中如何獲取指針類型的底層值?

Go
暮色呼如 2023-01-03 14:14:54
我發現了這個問題How to get a pointer to the underlying value of an Interface{} in Go,但它對我來說看起來太不安全了。當然我可以*用來解壓它,但我每次都必須在調用方添加 nil 檢查。x := &some_type fmt.Println(*x)如果指針為 nil,我期待函數返回基類型的默認值。x := Unpacker(some_type)
查看完整描述

2 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

我只是nil用 if 語句檢查。這是合理的做法。不過,如果您想探索替代方案,請繼續閱讀。


在 Go 1.18 中,您可以使用一個簡單的通用函數來完成此操作:


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. 不幸的是,沒有一種方便的方法來為所有可能的可空類型1聲明約束。


在 Go 1.17 及以下版本中,如果已知可能的類型集,則可以使用類型開關,但必須斷言結果。這具有允許對可空類型進行臨時初始化的次要優勢:


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再次返回的風險的相同限制:


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

}

游樂場:https ://go.dev/play/p/9dk0hWay90j


1:主要是因為這樣的約束必須捕獲映射類型的鍵和/或值類型,并決定在這些情況下(任意)返回什么。


查看完整回答
反對 回復 2023-01-03
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

我正在接受另一個答案,但這是我嘗試過的,顯然也適用于原語。


func Unwrap[T any](x *T) (r T) {

    if x != nil {

        r = *x

    }

    return

}


查看完整回答
反對 回復 2023-01-03
  • 2 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號