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

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

返回泛型類型的默認(rèn)值

返回泛型類型的默認(rèn)值

Go
www說 2022-10-24 15:03:29
你如何返回nil一個泛型類型T?func (list *mylist[T]) pop() T {    if list.first != nil {        data := list.first.data        list.first = list.first.next        return data    }    return nil}func (list *mylist[T]) getfirst() T {    if list.first != nil {        return list.first.data    }    return nil}我收到以下編譯錯誤: cannot use nil as T value in return statement
查看完整描述

3 回答

?
瀟湘沐

TA貢獻(xiàn)1816條經(jīng)驗 獲得超6個贊

您不能返回nil任何類型。例如,如果int用作類型參數(shù),則T返回nil沒有意義。nil也不是結(jié)構(gòu)的有效值。


您可能會做的——以及有意義的事情——是為用于 的類型參數(shù)返回零值T。例如,零值nil用于指針、切片,它是空字符串string,0用于整數(shù)和浮點(diǎn)數(shù)。


如何返回零值?只需聲明一個類型的變量T,然后返回它:


func getZero[T any]() T {

    var result T

    return result

}

測試它:


i := getZero[int]()

fmt.Printf("%T %v\n", i, i)


s := getZero[string]()

fmt.Printf("%T %q\n", s, s)


p := getZero[image.Point]()

fmt.Printf("%T %v\n", p, p)


f := getZero[*float64]()

fmt.Printf("%T %v\n", f, f)

哪些輸出(在Go Playground上嘗試):


int 0

string ""

image.Point (0,0)

*float64 <nil>


查看完整回答
反對 回復(fù) 2022-10-24
?
FFIVE

TA貢獻(xiàn)1797條經(jīng)驗 獲得超6個贊

*new(T)成語_

這已被建議作為 golang-nuts 中的首選選項。如果/當(dāng)一些零值內(nèi)置被添加到語言中時,它可能不太可讀,但更容易找到和替換。


它還允許單行賦值。


new內(nèi)置函數(shù)為任何類型的變量分配存儲空間并返回指向它的指針,因此取消引用*new(T)有效地為T. 您可以使用類型參數(shù)作為參數(shù):


func Zero[T any]() T {

    return *new(T)

}

如果T是可比較的,這可以方便地檢查某個變量是否為零值:


func IsZero[T comparable](v T) bool {

    return v == *new(T)

}

var類型T

直截了當(dāng)且更易于閱讀,盡管它總是需要多一行:


func Zero[T any]() T {

    var zero T

    return zero

}

命名返回類型

如果您不想顯式聲明變量,則可以使用命名返回。不是每個人都喜歡這種語法,盡管當(dāng)你的函數(shù)體比這個人為的例子更復(fù)雜時,或者如果你需要在defer語句中操作值時,這可能會派上用場:


func Zero[T any]() (ret T) {

    return

}


func main() {

    fmt.Println(Zero[int]())               // 0

    fmt.Println(Zero[map[string]int]())    // map[]  

    fmt.Println(Zero[chan chan uint64]())  // <nil>

}

命名返回的語法不可能與 var 聲明的語法非常相似。


使用您的示例:


func (list *mylist[T]) pop() (data T) {

    if list.first != nil {

        data = list.first.data

        list.first = list.first.next

    }

    return

}

返回nil不可空類型

如果您真的想這樣做,如您的問題中所述,您可以明確返回*T。


當(dāng)類型參數(shù)T被限制為不包括指針類型的東西時,可以做到這一點(diǎn)。在這種情況下,您可以將返回類型聲明為*T,現(xiàn)在您可以返回nil,這是指針類型的零值。


// constraint includes only non-pointer types

func getNilFor[T constraints.Integer]() *T {    

    return nil

}


func main() {

    fmt.Println(reflect.TypeOf(getNilFor[int]()))    // *int

    fmt.Println(reflect.TypeOf(getNilFor[uint64]())) // *uint64

}

讓我再次聲明一下:當(dāng)不受任何允許指針類型的限制時,這最有效,T否則你得到的是指針到指針類型:


// pay attention to this

func zero[T any]() *T {

    return nil

}


func main() {

    fmt.Println(reflect.TypeOf(zero[int]()))  // *int, good

    fmt.Println(reflect.TypeOf(zero[*int]())) // **int, maybe not what you want...

}


查看完整回答
反對 回復(fù) 2022-10-24
?
嗶嗶one

TA貢獻(xiàn)1854條經(jīng)驗 獲得超8個贊

您可以初始化一個空變量。


if l == 0 {

        var empty T

        return empty, errors.New("empty Stack")

    }


查看完整回答
反對 回復(fù) 2022-10-24
  • 3 回答
  • 0 關(guān)注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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