Q:

Go: Cast type fails for map[string]interface{} to map[string]string

I wasn't sure why the following casting doesn't work: 
import "fmt"

func main() {
    v := map[string]interface{}{"hello": "world"}
    checkCast(v)

}

func checkCast(v interface{}) {
    _, isCorrectType := v.(map[string]string)
    if !isCorrectType { 
        fmt.Printf("incorrect type")  <------------- why does it enter this if statement?
        return
    }
}

A:

map[string]interface{} is not the same as map[string]string. Type interface{} is not the same as type string.
If they are both map[string]string:
package main

import "fmt"

func main() {
    v := map[string]string{"hello": "world"}
    checkCast(v)

}

func checkCast(v interface{}) {
    _, isCorrectType := v.(map[string]string)
    if !isCorrectType {
        fmt.Printf("incorrect type")
        return
    }
}

Output:
[no output]

The statement v.(map[string]string) is a type assertion, not a cast.

The Go Programming Language Specification
Type assertions
For an expression x of interface type and a type T, the primary
  expression
x.(T)

asserts that x is not nil and that the value stored in x is of
  type T. The notation x.(T) is called a type assertion.

Go has conversions.

The Go Programming Language Specification
Conversions
Conversions are expressions of the form T(x) where T is a type and
  x is an expression that can be converted to type T.

