Interfaces and Errors
Type Assertions
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
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)
}
}
useNumber ← true, value ← <nil>
5func main() {6 var useNumber→ true = true //@useNumber=false7 var value→ <nil> interface{}value ← 42
9if useNumbertrue {10 value→ 42 = 4211} else {number ← 42, ok ← true
15number→ 42, ok→ true := value.(int)16if ok {if ok
15number, ok := value.(int)16if oktrue {17 fmt.Println("kind= number")18 fmt.Println("value=", number42)19} else {outputkind= number value= 42
useNumber ← false, value ← <nil>
5func main() {6 var useNumber→ false = false7 var value→ <nil> interface{}value ← "forty-two"
10 value = 4211} else {12 value→ "forty-two" = "forty-two"13}number ← 0, ok ← false
15number→ 0, ok→ false := value.(int)16if ok {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