改进扩展实现者之间的反射



我有一个表示结果的最小状态的Result接口。现在有不同的结构体实现了Result接口,但也添加了自己的方法。其中一个是SpecialResult,它实现了基本的Value()方法,但也实现了特殊的Special()方法。

可以在下面的代码片段中看到:

package main
import (
    "fmt"
    "reflect"
)
type Result interface {
    Value() string
}
type SpecialResult struct {
    value string
}
func (r *SpecialResult) Value() string {
    return r.value
}
func (r *SpecialResult) Special() string {
    return "look I am special!!"
}
func main() {
    sr := &SpecialResult{
        value: "1234",
    }
    doSomething(sr)
}
func doSomething(r Result) {
    switch reflect.TypeOf(r).String() {
    case "*main.SpecialResult":
        fmt.Printf("%s, %sn", r.Value(), r.(*SpecialResult).Special())
        break
    default:
        fmt.Printf("%sn", r.Value())
    }
}
    游乐场

当你读到最后几行代码时,你可能会和我有同样的感觉:这看起来很奇怪。

是否有更好的方法来实现所示的设置?

博多

使用类型断言

package main
import (
    "fmt"
)
type Result interface {
    Value() string
}
type SpecialResult struct {
    value string
}
func (r *SpecialResult) Value() string {
    return r.value
}
func (r *SpecialResult) Special() string {
    return "look I am special!!"
}
func main() {
    sr := &SpecialResult{
        value: "1234",
    }
    doSomething(sr)
}
func doSomething(r Result) {
    if special, ok := r.(*SpecialResult); ok {
        fmt.Printf("%s, %sn", special.Value(), special.Special())
    } else {
        fmt.Printf("%sn", r.Value())
    }
}
游乐场

相关内容

  • 没有找到相关文章

最新更新