亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

將接口斷言為其類型

將接口斷言為其類型

Go
四季花海 2023-03-29 16:13:38
在一般情況下,我無法優雅地將圖像的像素作為數組獲取。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.現在函數 getPixels 看起來像這樣: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)}但我認為這很丑陋。Golang 知道圖像的類型,我更喜歡這樣的東西: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界面獲取類型?
查看完整描述

1 回答

?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

你的大if ... else結構可以通過使用這樣的類型開關來簡化:

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


由于所有圖像實現都是具有名為 的字段的結構指針Pix,因此您可以使用反射來獲取該字段。此實現將處理未來的圖像實現而無需任何更改(如果它們也將是具有Pix字段的結構)。


這就是它的樣子:


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)

}

測試它:


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


查看完整回答
反對 回復 2023-03-29
  • 1 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號