go / beginner
Snippet
Type-Switches und Type-Assertions
Type-Assertions greifen auf den konkreten Typ zu, der in einer Interface-Variable gespeichert ist. Die Syntax v.(T) gibt den Wert und einen Boolean zurück, der den Erfolg anzeigt. Type-Switches vergleichen den tatsächlichen Typ anstelle des Werts, unter Verwendung des speziellen Schlüsselworts type. Sie sind der idiomatische Weg, um interface{}-Werte zu behandeln, wenn du ihren zugrunde liegenden Typ inspizieren musst. Verwende immer die ok-Form, um fehlgeschlagene Assertions sicher zu behandeln und Panik zu vermeiden.
snippet.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
35
package mainimport "fmt"func printType(v interface{}) {switch val := v.(type) {case int:fmt.Printf("Integer: %d\n", val*2)case string:fmt.Printf("String: %s (length: %d)\n", val, len(val))case bool:fmt.Printf("Boolean: %t\n", val)case []int:fmt.Printf("Int slice with %d elements\n", len(val))default:fmt.Printf("Unknown type\n")}}func main() {// Type assertionvar i interface{} = "hello"s, ok := i.(string)fmt.Printf("Assertion success: %v, value: %s\n", ok, s)// Failed assertionvar j interface{} = 42str, ok := j.(string)fmt.Printf("String assertion success: %v, value: %s\n", ok, str)printType(100)printType("Go rocks")printType(true)printType([]int{1, 2, 3})}
Erklärung
1
s, ok := i.(string)
Sichere Type-Assertion - ok ist false wenn Typ nicht übereinstimmt, kein Panic
2
switch val := v.(type) { ... }
Type-Switch verwendet 'type'-Schlüsselwort, val ist auf jeden Case beschränkt
3
case int: fmt.Printf("%d\n", val*2)
Innerhalb des int-Case ist val ein int (nicht interface{}), kann direkt verwendet werden
4
val, ok := j.(string)
Schlägt sicher fehl, da j int enthält, ok wird false