capypad
0 Tage Serie
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
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 main
 
import "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 assertion
var i interface{} = "hello"
s, ok := i.(string)
fmt.Printf("Assertion success: %v, value: %s\n", ok, s)
 
// Failed assertion
var j interface{} = 42
str, 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