我有一个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())
}
}
当你阅读最后几行代码时,你可能会觉得和我一样:这看起来很奇怪。
有更好的方法来实现所显示的设置吗?
博多
答案 0 :(得分:4)
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())
}
}