capypad
0 Tage Serie
go / beginner
Snippet

Type-Assertionen und Type-Switches

Empty Interface `interface{}` akzeptiert jeden Typ. Type-Assertionen extrahieren den zugrunde liegenden Typ mit `i.(type)` im Switch oder `i.(T)` für direkte Assertion. Das Komma-Ok-Idiom prüft, ob die Assertion erfolgreich war.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main
 
import "fmt"
 
func describe(i interface{}) {
switch v := i.(type) {
case nil:
fmt.Println("nil value")
case int:
fmt.Printf("int: %d\n", v)
case string:
fmt.Printf("string: %s\n", v)
case []int:
fmt.Printf("int slice with %d elements\n", len(v))
default:
fmt.Printf("unknown type: %T\n", v)
}
}
 
func main() {
describe(42)
describe("hello")
describe([]int{1, 2, 3})
var i interface{} = "test"
s := i.(string)
fmt.Println("Asserted string:", s)
if val, ok := i.(int); ok {
fmt.Println("Got int:", val)
} else {
fmt.Println("Not an int")
}
}
Erklärung
1
switch v := i.(type)
Type-Switch untersucht den dynamischen Typ von Interface
2
s := i.(string)
Direkte Type-Assertion, paniced wenn falscher Typ
3
if val, ok := i.(int); ok
Komma-Ok-Idiom prüft Assertion sicher
4
%T
Printf-Verb für das Ausgeben des Typs eines Werts