Code:
package main
import (
"fmt"
"time"
)
func main() {
var my *time.Time
var any interface{}
any = my
stringer, ok := any.(fmt.Stringer)
println(ok) // "true", but I expected "false", as the receiver for
time.Time.String() is (t time.Time), not (t *time.Time)
println(stringer.String()) // "panic: value method time.Time.String called
using nil *Time pointer"
}
playground: https://play.golang.org/p/qVyr_u11Tku
Question 1:
I don't understand when the type assertion succeeds here, as the receiver
for time.Time.String() is (t time.Time), not (t *time.Time). The language
specification states:
"If T is an interface type, x.(T) asserts that the dynamic type of x
implements the interface T."
(from: https://golang.org/ref/spec#Type_assertions)
Does this mean that I should read "dynamic type of x" as "the actual type
of x" or the "dereferenced type of x if x is a pointer"? Is there a formal
definition of "dynamic type of x"? Or should I look at a different part of
the spec?
Question 2:
Accepting that I get "true" on a pointer to a type that implements
fmt.Stringer, how can I check that I can actually safely call
stringer.String()? I.e. how can I prevent the runtime panic? Without using
reflection. Please note: I do not mean checking if there is a nil pointer
in x: the error is not raised by the time.String() implementation, in fact
it might work fine with nil pointers were it defined using a pointer
receiver. It seems the error is thrown by the runtime.
Thanks,
Markus
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/CAMoB8rV%3DQTcHXRC4KvJfcHC9zo8oAE0LR9%3D4ywVb_s-iejX14A%40mail.gmail.com.