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

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

go 支持多類型嗎?(泛型類型)

go 支持多類型嗎?(泛型類型)

Go
回首憶惘然 2022-05-23 16:49:51
type MyNumber interface {    float32, float64, uint, int // this is not supported}func PrintNumber(n MyNumber) {    switch n.(type) {    case float32, float64, uint, int:        fmt.Printf("%v\n", n)    default:        panic("PrintNumber only supports types float32, float64, uint, int")    }}在go中,可以定義一個(gè)空白接口,基本上允許任何類型var v interface{}v = "string"v = 0.1有沒有辦法將允許的類型減少到特定的類型列表?就像是type MyNumber float32, float64, uint, int或者type MyNumber interface {    float32, float64, uint, int}這樣我就可以讓編譯器檢查函數(shù)是否支持該類型。
查看完整描述

3 回答

?
白豬掌柜的

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

有沒有辦法將允許的類型減少到 [空接口] 的特定類型列表?

在編譯時(shí),沒有。

但是,您可以選擇在運(yùn)行時(shí)使用限制。當(dāng)有其他選擇時(shí),應(yīng)該避免這種情況,因?yàn)樗荒芴峁┳銐虻陌踩浴?/p>

這是在標(biāo)準(zhǔn)庫中的許多地方完成的,例如 json marshaler,它需要一個(gè)指針作為目標(biāo)。


查看完整回答
反對 回復(fù) 2022-05-23
?
ITMISS

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

您不能在編譯時(shí)以您想要的方式強(qiáng)制使用一組具體類型。


您可以做的是使用接口。列出您期望從實(shí)現(xiàn)中獲得的接口中的方法。那么具體的運(yùn)行時(shí)類型是什么就無關(guān)緊要了。您僅通過接口與值交互,這在編譯時(shí)保證它是由傳遞的值實(shí)現(xiàn)的。


例如,如果您希望該值提供一個(gè)int32值,請使用此接口:


type HasInt32 interface {

    Int32() int32

}


func f(i HasInt32) {

    fmt.Println("int32 value:", i.Int32())

}

int32傳遞的值是否具有或float64作為其基礎(chǔ)類型,或者它是任何其他復(fù)雜類型都無關(guān)緊要。你需要一個(gè)int32,這就是你得到的。實(shí)現(xiàn)者負(fù)責(zé)如何產(chǎn)生該值。


例如:


type MyInt32 int32


func (m MyInt32) Int32() int32 { return int32(m) }


type MyStruct struct {

    i int64

}


func (m MyStruct) Int32() int32 { return int32(m.i) }

測試它:


var m MyInt32 = 1

f(m)


var s MyStruct = MyStruct{i: 2}

f(s)

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


int32 value: 1

int32 value: 2


查看完整回答
反對 回復(fù) 2022-05-23
?
30秒到達(dá)戰(zhàn)場

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

有沒有辦法將允許的類型減少到特定的類型列表?


是的,從 Go 1.18 開始,使用帶有類型元素的接口。但是這樣的接口只能作為類型參數(shù)的約束。在規(guī)范的草案版本中,接口類型下提到了這一點(diǎn):


包含非接口類型、~T 形式的術(shù)語或聯(lián)合的接口只能用作類型約束,或用作用作約束的其他接口的元素。它們不能是值或變量的類型,也不能是其他非接口類型的組件。


簡而言之,在接口中,除了方法簽名和其他嵌入式接口之外,您現(xiàn)在可以添加類型元素。這定義了一個(gè)類型約束,即“相應(yīng)類型參數(shù)的允許類型參數(shù)集”。


尤其:


接口約束可以指定一個(gè)或多個(gè)類型元素。它將類型參數(shù)限制為指定的類型。您可以將多個(gè)類型元素指定為聯(lián)合(更多信息:Go Generics - Unions)

type MyNumber interface {

    float32 | float64 | uint | int

}

您可以使用標(biāo)記~來指定近似元素,即基礎(chǔ)類型為的所有類型的集合T(更多信息:Go 中新標(biāo)記?的含義是什么(近似元素)?)。這些也可以是工會的一部分。

type MyNumber interface {

    ~float32 | ~float64 | ~uint | ~int

}

您仍然可以在這樣的接口中指定方法簽名。它將類型參數(shù)限制為也實(shí)現(xiàn)接口的那些類型的集合:

// set of types with underlying int that also implement `String() string`

type MyNumber interface {

    ~int

    String() string

}

作為上述推論,如果接口指定了非近似的預(yù)聲明類型和方法,則沒有類型會滿足接口(因?yàn)槟荒茉陬A(yù)聲明類型上聲明方法)

// empty type set

type MyNumber interface {

    int

    String() string

}

如前所述,您僅將其用作類型參數(shù)約束,您將無法在類型切換、聲明變量等中使用它:


func foo[T MyNumber](v T) {

    // ...

}


查看完整回答
反對 回復(fù) 2022-05-23
  • 3 回答
  • 0 關(guān)注
  • 212 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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