Type assertions and type switches


A type assertion provides access to an interface’s concrete value.

Type assertions

A type assertion doesn’t really convert an interface to another data type, but it provides access to an interface’s concrete value, which is typically what you want.

The type assertion x.(T) asserts that the concrete value stored in x is of type T, and that x is not nil.

var x interface{} = "foo"

var s string = x.(string)
fmt.Println(s)     // "foo"

s, ok := x.(string)
fmt.Println(s, ok) // "foo true"

n, ok := x.(int)
fmt.Println(n, ok) // "0 false"

n = x.(int)        // ILLEGAL
panic: interface conversion: interface {} is string, not int

Type switches

A type switch performs several type assertions in series and runs the first case with a matching type.

var x interface{} = "foo"

switch v := x.(type) {
case nil:
    fmt.Println("x is nil")            // here v has type interface{}
case int: 
    fmt.Println("x is", v)             // here v has type int
case bool, string:
    fmt.Println("x is bool or string") // here v has type interface{}
    fmt.Println("type unknown")        // here v has type interface{}
x is bool or string

Further reading

Interface essentials in 5 easy steps

Share this page: