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

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

使用泛型時從接口獲取基類型

使用泛型時從接口獲取基類型

Go
慕村9548890 2022-12-19 17:53:41
我有一個我無法更改的功能,該功能看起來像foo(interface{}). 在其他一些類型中,此函數(shù)可以采用類型[]byte但不能采用[16]byte. 我想寫一個基于泛型的小適配器來添加對 UUID 的支持而不是編寫foo(uuid[:]). 但我不想掛在特定的實現(xiàn)上。例如,而不是import (    gofrsuuid "github.com/gofrs/uuid"    googleuuid "github.com/google/uuid")type AcceptedCertainTypes interface {    int | gofrsuuid.UUID | googleuuid.UUID // | etc...}我希望有type AcceptedTypes interface {    int | ~[16]byte}但我不知道該怎么做。當我們使用某些類型時,很容易將它們變成正確的類型。func rewrittenFoo[T AcceptedCertainTypes](val T) {    var t interface{} = *new(T)    switch t.(type) {    case gofrsuuid.UUID:        k := val.(gofrsuuid.UUID)        foo(k[:])    case googleuuid.UUID:        k := val.(googleuuid.UUID)        foo(k[:])    }}但是如何將interface{}contains轉(zhuǎn)換gofrsuuid.UUID為該基本類型[16]byte?
查看完整描述

1 回答

?
MMMHUHU

TA貢獻1834條經(jīng)驗 獲得超8個贊

您不能對聯(lián)合的近似項(如 )進行詳盡的類型轉(zhuǎn)換~[16]byte,因為定義設置的類型是未綁定的。您必須使用反射來提取數(shù)組類型并最終將其重新切片。


只有一個近似項

如果近似項~[16]byte在聯(lián)合中是唯一的,你可以在default塊中進行類型轉(zhuǎn)換和處理。這是基于類型參數(shù)的編譯時類型安全性,因此該default塊不會以任何意外類型運行:


func rewrittenFoo[T int | ~[16]byte](val T) {

    switch t := any(val).(type) {

    // handle all non-approximate type cases first

    case int:

        foo(t) // t is int


    // this will be all other types in T's type set that are not int

    // so effectively ~[16]byte

    default:

        v := reflect.ValueOf(t).Convert(reflect.TypeOf([16]byte{})).Interface().([16]byte)

        foo(v[:])

    }

}

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


許多不同的近似項

如果聯(lián)合中有很多代字號,則不能依賴default大小寫。如果底層類型都不同,您可以打開reflect.Kind:


func rewrittenFoo[T int | ~float64 | ~[16]byte](val T) {

    // handle all non-approximate type cases first

    switch t := any(val).(type) {

    case int:

        foo(t)

    }


    switch reflect.TypeOf(val).Kind() {

    case reflect.Float:

        // ...


    case reflect.Array:

        // ...

    }

}

許多相似的近似項

類型參數(shù)不會有太大幫助,只需使用any并詳盡地類型切換所有可能的類型。您可以將您知道具有相同基礎類型的類型分組,并使用Value#Convert如上所示 - 或特定于類型的方法(如Value#Int()或Value#String()-)來類似地處理它們。


查看完整回答
反對 回復 2022-12-19
  • 1 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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