Type assertions recover a concrete value from an interface value.

type assertion The `value, ok := item.(Type)` form checks whether an interface value holds a specific concrete type.

Type Assertions

useNumber
type_assertion.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

func main() {
	var useNumber = true
	var value interface{}

	if useNumber {
		value = 42
	} else {
		value = "forty-two"
	}

	number, ok := value.(int)
	if ok {
		fmt.Println("kind= number")
		fmt.Println("value=", number)
	} else {
		fmt.Println("kind= text")
		fmt.Println("value=", value)
	}
}
package main

import "fmt"

func main() {
	var useNumber = false
	var value interface{}

	if useNumber {
		value = 42
	} else {
		value = "forty-two"
	}

	number, ok := value.(int)
	if ok {
		fmt.Println("kind= number")
		fmt.Println("value=", number)
	} else {
		fmt.Println("kind= text")
		fmt.Println("value=", value)
	}
}
  1. useNumber ← true, value ← <nil>

    5func main() {6  var useNumber→ true = true //@useNumber=false7  var value→ <nil> interface{}
  2. value ← 42

    9if useNumbertrue {10  value→ 42 = 4211} else {
  3. number ← 42, ok ← true

    15number→ 42, ok→ true := value.(int)16if ok {
  4. if ok

    15number, ok := value.(int)16if oktrue {17  fmt.Println("kind= number")18  fmt.Println("value=", number42)19} else {
    outputkind= number
    value= 42
  1. useNumber ← false, value ← <nil>

    5func main() {6  var useNumber→ false = false7  var value→ <nil> interface{}
  2. value ← "forty-two"

    10  value = 4211} else {12  value→ "forty-two" = "forty-two"13}
  3. number ← 0, ok ← false

    15number→ 0, ok→ false := value.(int)16if ok {
  4. else

    18  fmt.Println("value=", number)19} else {20  fmt.Println("kind= text")21  fmt.Println("value=", value"forty-two")22}
    outputkind= text
    value= forty-two