The long-form (with comma-ok) ones were already fixed but the short-form ones were not because they were in a completely different code path. This PR also refactors the code so that both short-form and long-form are now merged in the same function. N.B: even though most (all?) cases seem to now be supported, one of them still yields a result that does not satisfy reflect's Implements method yet. It does not prevent the resulting assertion to be usable though. N.B2: the code path for the third-form (_, ok) hasn't been fixed and/or refactored yet. Fixes #919
61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"time"
|
|
)
|
|
|
|
type TestStruct struct{}
|
|
|
|
func (t TestStruct) String() string {
|
|
return "hello world"
|
|
}
|
|
|
|
func main() {
|
|
aType := reflect.TypeOf((*fmt.Stringer)(nil)).Elem()
|
|
|
|
var t interface{}
|
|
t = time.Nanosecond
|
|
s, ok := t.(fmt.Stringer)
|
|
if !ok {
|
|
fmt.Println("time.Nanosecond does not implement fmt.Stringer")
|
|
return
|
|
}
|
|
fmt.Println(s.String())
|
|
fmt.Println(t.(fmt.Stringer).String())
|
|
bType := reflect.TypeOf(time.Nanosecond)
|
|
fmt.Println(bType.Implements(aType))
|
|
|
|
|
|
t = 42
|
|
foo, ok := t.(fmt.Stringer)
|
|
if !ok {
|
|
fmt.Println("42 does not implement fmt.Stringer")
|
|
} else {
|
|
fmt.Println("42 implements fmt.Stringer")
|
|
}
|
|
_ = foo
|
|
|
|
var tt interface{}
|
|
tt = TestStruct{}
|
|
ss, ok := tt.(fmt.Stringer)
|
|
if !ok {
|
|
fmt.Println("TestStuct does not implement fmt.Stringer")
|
|
return
|
|
}
|
|
fmt.Println(ss.String())
|
|
fmt.Println(tt.(fmt.Stringer).String())
|
|
// TODO(mpl): uncomment when fixed
|
|
// cType := reflect.TypeOf(TestStruct{})
|
|
// fmt.Println(cType.Implements(aType))
|
|
}
|
|
|
|
// Output:
|
|
// 1ns
|
|
// 1ns
|
|
// true
|
|
// 42 does not implement fmt.Stringer
|
|
// hello world
|
|
// hello world
|