第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

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

2 回答

?
小怪獸愛(ài)吃肉

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)檫@樣的約束必須捕獲映射類型的鍵和/或值類型,并決定在這些情況下(任意)返回什么。


查看完整回答
反對(duì) 回復(fù) 2023-01-03
?
臨摹微笑

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

}


查看完整回答
反對(duì) 回復(fù) 2023-01-03
  • 2 回答
  • 0 關(guān)注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)