我有一个表示结果的最小状态的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())
}
}
游乐场