How to determine an interface{} value's “real” type?

I have not found a good resource for using interface{} types. For example

package main

import "fmt"

func weirdFunc(i int) interface{} {
    if i == 0 {
        return "zero"
    }
    return i
}
func main() {
    var i = 5
    var w = weirdFunc(5)

    // this example works!
    if tmp, ok := w.(int); ok {
        i += tmp
    }

    fmt.Println("i =", i)
}

Do you know of a good introduction to using Go’s interface{} ?

specific questions:

  • how do I get the “real” Type of w?
  • is there any way to get the string representation of a type?
  • is there any way to use the string representation of a type to convert a value?