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

casting, go

Solution

`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`.

Problem

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 } } ```

Original source