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

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

在恒等函數(shù)中將類型 T 轉(zhuǎn)換為類型 U

在恒等函數(shù)中將類型 T 轉(zhuǎn)換為類型 U

Go
絕地?zé)o雙 2023-03-15 14:22:39
使用下面給定的類型簽名,有沒有辦法做類似于下面的事情?func Transform[T, U any](item T) U {    return item}上面的代碼給出了以下錯(cuò)誤:cannot use item (variable of type T constrained by any) as U value in return statement我無法使用上面的類型簽名,因?yàn)槲冶举|(zhì)上是在嘗試制作一個(gè)可選的轉(zhuǎn)換方法,有時(shí)需要從 T 轉(zhuǎn)換為 U,但有時(shí)只返回自身。下面顯示了一個(gè)更詳細(xì)的用例示例。type SomeStruct[T, U any] struct {    Transform func(T) U}func (s SomeStruct[T, U]) Transform(elem T) (U) {    if s.Transform != nil {        return s.Transform(elem)    }    return elem}有沒有辦法創(chuàng)建一個(gè)有時(shí)有條件地只返回自身的 Transform 函數(shù)?
查看完整描述

2 回答

?
阿波羅的戰(zhàn)車

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

您可以使您的代碼片段工作:


func Transform[T, U any](item T) U {

    return any(item).(U)

}

但是如果與 的實(shí)際類型不斷言兼容,代碼將因恐慌而失敗:Uitem


這會(huì)恐慌:


fmt.Println(Transform[string, int]("foo"))


// Output: panic: interface conversion: interface {} is string, not int

這在沒有恐慌的情況下成功了,因?yàn)閎ytes.Buffer它同時(shí)實(shí)現(xiàn)了io.Reader和io.Writer接口:


b := &bytes.Buffer{}

_ = Transform[io.Writer, io.Reader](b)

所以,可以做你想做的事。但我不確定它有多大用處,因?yàn)閷?shí)際參數(shù)運(yùn)行時(shí)失敗與U.


查看完整回答
反對 回復(fù) 2023-03-15
?
心有法竹

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊

T如果您的函數(shù)定義為 return ,則無法返回U。即使您斷言Tto U,該函數(shù)仍會(huì)返回U。


如果你真的想返回or T,U你需要將返回類型聲明為any:


func (s SomeStruct[T, U]) Transform(elem T) any { /* ... */ }

...放棄靜態(tài)類型;或者您可以使用“任一”類型的助手:


type Either[T, U any] struct {

    value any

}


// Either methods


func (s SomeStruct[T, U]) Transform(elem T) Either[T, U] {

    if s.transform == nil {

        return Either[T, U]{elem}

    }

    return Either[T, U]{s.transform(elem)}

}

看看如何在這個(gè) playground中使用它。


備選方案將偏離您的既定目標(biāo)。一種是實(shí)際斷言Tto U,但您必須知道這會(huì)返回U,而不是T,即使T它的值可分配給U:


func (s SomeStruct[T, U]) Transform(elem T) U {

    if s.transform == nil {

        if u, ok := any(elem).(U); ok {

            return u

        }

        return *new(U) // U's zero value if elem assertion fails

    }

    return s.transform(elem)

}

您必須使用斷言,因?yàn)轭愋蛥?shù)T和U都受 約束any,因此(理所當(dāng)然地)沒有其他方式來表達(dá)兩者之間的可轉(zhuǎn)換性。comma-ok 習(xí)慣用法有助于避免運(yùn)行時(shí)恐慌。


或者您可以返回(U, error),這通常是合理的做法:


func (s SomeStruct[T, U]) Transform(elem T) (u U, err error) {

    if s.transform == nil {

        err = errors.New("transform function not set")

        return 

    }

    u = s.transform(elem)

    return

}

游樂場:https://go.dev/play/p/GKLRmKKWxlP


查看完整回答
反對 回復(fù) 2023-03-15
  • 2 回答
  • 0 關(guān)注
  • 147 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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