reflect: document reflect.TypeOf((*Foo)(nil)).Elem() idiom

See also golang-dev discussion:
https://groups.google.com/d/msg/golang-dev/Nk9gnTINlTg/SV8rBt-2__kJ

Change-Id: I49edd98d73400c1757b6085dec86752de569c01a
Reviewed-on: https://go-review.googlesource.com/8923
Reviewed-by: Rob Pike <r@golang.org>
This commit is contained in:
Matthew Dempsky 2015-04-14 09:56:05 -07:00 committed by Rob Pike
parent eba38fd780
commit eced964c2d
2 changed files with 17 additions and 2 deletions

View File

@ -6,6 +6,8 @@ package reflect_test
import (
"fmt"
"io"
"os"
"reflect"
)
@ -64,3 +66,16 @@ func ExampleStructTag() {
// Output:
// blue gopher
}
func ExampleTypeOf() {
// As interface types are only used for static typing, a
// common idiom to find the reflection Type for an interface
// type Foo is to use a *Foo value.
writerType := reflect.TypeOf((*io.Writer)(nil)).Elem()
fileType := reflect.TypeOf((*os.File)(nil))
fmt.Println(fileType.Implements(writerType))
// Output:
// true
}

View File

@ -1009,8 +1009,8 @@ func (t *structType) FieldByName(name string) (f StructField, present bool) {
return t.FieldByNameFunc(func(s string) bool { return s == name })
}
// TypeOf returns the reflection Type of the value in the interface{}.
// TypeOf(nil) returns nil.
// TypeOf returns the reflection Type that represents the dynamic type of i.
// If i is a nil interface value, TypeOf returns nil.
func TypeOf(i interface{}) Type {
eface := *(*emptyInterface)(unsafe.Pointer(&i))
return toType(eface.typ)