Everyone expects these values to be scoped inside the loop, but go reuses the same memory location for every iteration. This means that you must never let the address of key, value, or i above escape the loop. An anonymous func() { /* do something with i */ } (a "closure") is a subtle way of taking a variable's address

Nil interface is not the same as having a nil pointer in the interface.

Guess what? The above test will NOT detect the nil pointer! This is because the interface serves as a pointer, so GetACat effectively returns a pointer to a nil pointer. Never do the thing that GetACat does, and you (and your coworkers) will be much happier. It is very easy to do this with error values. http://golang.org/doc/faq#nil_error

which is similar to the first case in the original post, "defer fmt.Println(i) // OK; prints 9 ... 0". (Here's the new code in the Playground.)

In other words, a method call is equivalent to a regular function call with the receiver passed as an argument. Since the argument is evaluated at the time the defer statement is invoked, you get different values of t each time.