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

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

將接口斷言為其類(lèi)型

將接口斷言為其類(lèi)型

Go
四季花海 2023-03-29 16:13:38
在一般情況下,我無(wú)法優(yōu)雅地將圖像的像素作為數(shù)組獲取。f, err := os.Open(imgPath)check(err)defer f.Close()img, _, err := image.Decode(bufio.NewReader(f))check(err)pixels, err := getPixels(img)check(err)// Logic with pixels.現(xiàn)在函數(shù) getPixels 看起來(lái)像這樣:func getPixels(img image.Image) ([]uint8, error) {    if i, ok := img.(*image.NRGBA); ok {        return i.Pix, nil    } else if i, ok := img.(*image.Alpha); ok {        return i.Pix, nil    } else if i, ok := img.(*image.Alpha16); ok {        return i.Pix, nil    } else if i, ok := img.(*image.CMYK); ok {        return i.Pix, nil    } else if i, ok := img.(*image.Gray); ok {        return i.Pix, nil    } else if i, ok := img.(*image.Gray16); ok {        return i.Pix, nil    } else if i, ok := img.(*image.NRGBA64); ok {        return i.Pix, nil    } else if i, ok := img.(*image.Paletted); ok {        return i.Pix, nil    } else if i, ok := img.(*image.RGBA); ok {        return i.Pix, nil    } else if i, ok := img.(*image.RGBA64); ok {        return i.Pix, nil    }    return nil, fmt.Errorf("unknown image type %T", img)}但我認(rèn)為這很丑陋。Golang 知道圖像的類(lèi)型,我更喜歡這樣的東西:func getPixels(img image.Image) ([]uint8, error) {    if i, ok := img.(eval(fmt.Sprintf("%T", img))); ok {        return i.Pix, nil    }    return nil, fmt.Errorf("unknown image type %T", img)}我也不能斷言reflect.TypeOf(img)。也許有辦法從reflect.Type界面獲取類(lèi)型?
查看完整描述

1 回答

?
長(zhǎng)風(fēng)秋雁

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

你的大if ... else結(jié)構(gòu)可以通過(guò)使用這樣的類(lèi)型開(kāi)關(guān)來(lái)簡(jiǎn)化:

您仍然需要列出所有可能的類(lèi)型,但這樣更好。


由于所有圖像實(shí)現(xiàn)都是具有名為 的字段的結(jié)構(gòu)指針Pix,因此您可以使用反射來(lái)獲取該字段。此實(shí)現(xiàn)將處理未來(lái)的圖像實(shí)現(xiàn)而無(wú)需任何更改(如果它們也將是具有Pix字段的結(jié)構(gòu))。


這就是它的樣子:


func getPix(img image.Image) ([]uint8, error) {

? ? v := reflect.ValueOf(img)

? ? if v.Kind() == reflect.Ptr {

? ? ? ? v = v.Elem()

? ? }


? ? if v.Kind() == reflect.Struct {

? ? ? ? pv := v.FieldByName("Pix")

? ? ? ? if pv.IsValid() {

? ? ? ? ? ? if pix, ok := pv.Interface().([]uint8); ok {

? ? ? ? ? ? ? ? return pix, nil

? ? ? ? ? ? }

? ? ? ? }

? ? }


? ? return nil, fmt.Errorf("unknown image type %T", img)

}

測(cè)試它:


fmt.Println(getPix(&image.NRGBA{}))

fmt.Println(getPix(&image.RGBA{}))


type unknownImage struct{ image.Image }

fmt.Println(getPix(unknownImage{}))

輸出(在Go Playground上嘗試):


[] <nil>

[] <nil>

[] unknown image type main.unknownImage


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

添加回答

舉報(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)