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
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 mainimport "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