改善扩展实现者之间的反映

时间:2014-07-11 11:23:29

标签: reflection interface go

我有一个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, %s\n", r.Value(), r.(*SpecialResult).Special())
        break
    default:
        fmt.Printf("%s\n", r.Value())
    }
}
  1. Playground
  2. Source
  3. 当你阅读最后几行代码时,你可能会觉得和我一样:这看起来很奇怪。

    有更好的方法来实现所显示的设置吗?

    博多

1 个答案:

答案 0 :(得分:4)

使用Type Assertions

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, %s\n", special.Value(), special.Special())
    } else {
        fmt.Printf("%s\n", r.Value())
    }
}

Playground