So my first stab at documenting this would be something like:
-// 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.
+//
+// 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 pointer value:
+// fooType := reflect.TypeOf((*Foo)(nil)).Elem()
It's a bit wordy, but some rationale:
Values only have concrete (i.e., non-interface) types, so technically "reflection Type of the value" is unambiguously the dynamic type, but that seems needlessly subtle. Also, most function documentation refer to values by the parameter variable name. So "reflection Type of the value in i" seems less helpful than "reflection Type of the dynamic type of i".
"reflection Type of the dynamic type of i" felt clunky, so I used "reflection Type that represents the dynamic type of i" to mimic other documentation.
Explicitly mentioning "dynamic type" also helps contrast with why interface types need to be special cased.
Finally, TypeOf(nil) is unambiguously using a nil interface value, but it seems maybe worthwhile to clarify that it's specifically the nil *interface* value that causes TypeOf to return nil, to help contrast against the nil *pointer* value used in the example.