Reflect函数消除了开关和if语句在函数中的混合

问题描述 投票:0回答:1

[这个问题主要是关于化妆品,此代码确实可以完成预期的工作,但是我很希望能够在两种情况下都使用switch语句,而不是混合使用ifswitch

func fieldValue(field reflect.Value) string {
    format := "%v"
    if stringer, ok := field.Interface().(strfmt.DateTime); ok {
        return fmt.Sprintf(format, stringer.String())
    }
    switch field.Kind() {
    case reflect.Ptr:
        if field.IsNil() {
            return "<nil>"
        }
        field = field.Elem()
    }
    return fmt.Sprintf(format, field.Interface())
}
go switch-statement
1个回答
1
投票

您最能做的是:

func isDateTime(field reflect.Value) bool {
    _, result := field.Interface().(strfmt.DateTime)
    return result
}

func fieldValue(field reflect.Value) string {
    switch {
    case isDateTime(field):
        return field.Interface().(strfmt.DateTime).String()
    case field.Kind() == reflect.Ptr:
        if field.IsNil() {
            return "<nil>"
        }
        field = field.Elem()
        fallthrough
    default:
        return fmt.Sprintf("%v", field.Interface())
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.