I am playing with type assertion using the following dummy code, and I got the error:
cannot type switch on non-interface value
Doe
I figured out the answer, which is to cast n
to interface{}
before the type assertion:
switch v := interface{}(n).(type)
Type switches require an interface to introspect. If you are passing a value of known type to it it bombs out. If you make a function that accepts an interface as a parameter, it will work:
func typeSwitch(tst interface{}) {
switch v := tst.(type) {
case Stringer:
fmt.Println("Stringer:", v)
default:
fmt.Println("Unknown")
}
}
See the full code here http://play.golang.org/p/QNyf0eG71_ and the golang documentation on interfaces http://golang.org/doc/effective_go.html#interfaces.
There are no typecasts in Go. You are doing a type conversion.
There are two kinds of type conversions
conversion between basic data types. For this we can use the direct casting
i := 48
str := string(i)
But type conversion using value.(type) is for conversion among the class hierarchy, (e.g. where we want to get the specific implementation from the interface). Else, we get the above error.