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
- 1 回答
- 0 關注
- 159 瀏覽
添加回答
舉報