funcmain() { // 遍历slice,同array。 nums := []int{2, 3, 4} sum := 0 for _, num := range nums { sum += num } fmt.Println("sum:", sum)
// slice和array在遍历时都会返回索引和值。 for i, num := range nums { if num == 3 { fmt.Println("index:", i) } }
// 遍历map。 kvs := map[string]string{"a": "apple", "b": "banner"} for k, v := range kvs { fmt.Printf("%s -> %s\n", k, v) }
// 也可以只接收一个返回值,range会遍历map所有的key并返回。 for k := range kvs { fmt.Println("key:", k) }
// 对字符串进行遍历是通过unicode字节编码进行。 // 例子中的英文字符都是一个字节的长度,而中文字符‘哈’的utf8编码是三个字节长度,对应的二进制表示‘21704’,所以‘l’的索引值就是5。 for i, c := range"go哈lang" { fmt.Println(i, c) } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
$ go run range.go sum: 9 index: 1 a -> apple b -> banana key: a key: b 0 103 1 111 2 21704 5 108 6 97 7 110 8 103
funcmain() { i := 2 fmt.Print("Write", i, " as ") // 典型的switch结构 switch i { case1: fmt.Println("one") case2: fmt.Println("two") case3: fmt.Println("three") }
// case后可以跟多个条件,逗号分隔。也有常用的default。 switch time.Now().Weekday() { case time.Saturday, time.Sunday: fmt.Println("It's the weekend") default: fmt.Println("It's a weekday") }
// switch后不跟条件判断语句可以模仿if/else的功能 t := time.Now() switch { case t.Hour() < 12: fmt.Println("It's before noon") default: fmt.Println("It's after noon") }
// 变量类型判断的switch语句,其中的type是switch独有的用法。 // 主要用来判断一个interface值的类型。 whatAmI := func(i interface{}) { switch t := i.(type) { casebool: fmt.Println("I'm a bool") caseint: fmt.Println("I'm an int") default: fmt.Println("Don't know type %T\n", t) } } whatAmI(true) whatAmI(1) whatAmI("hey") }
1 2 3 4 5 6 7
$: go run switch.go Write 2 as two It's a weekday It's after noon I'm a bool I'm an int Don't know type string