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 关注
- 123 浏览
添加回答
举报