编辑代码

package main
import "fmt"
func main () {
    //标准方式一
    for i:=0; i < 2; i++ {
		fmt.Printf("i:%v\n", i)
	}
	fmt.Printf("\n")
	//方式二
	i:=0
	for i < 3 {
		fmt.Printf("i:%v\n", i)
		i++
	}

    fmt.Printf("\n")
    //无限循环 实现where ture
    // for {
    // fmt.Println("Hello, playground:")
    // }
    // for turn {
    // fmt.Println("Hello, playground:")
    // }

    /*循环控制-break、continue、goto
     1.break是用来结束整个循环语句
     2.continue是用来结束此次循环居于
    */
    //当i=3时,结束for循环
    for i := 1; i <= 5; i++ {
        if i == 3 {
            break
        }
        fmt.Printf("i:%v\n", i)
    }

    fmt.Printf("\n")
    //当i=3时,结束此次循环,开始下一次循环
    for i := 1; i <= 4; i++ {
        if i == 3 {
            continue
        }
        fmt.Printf("i:%v\n", i)
    }
    /*
    1.多重循环时,内部循环控制跳出外部循环,可以使用break 加上外部循环的标签块
    2.除了break、continue外,goto关键字也可以跳出循环
    */
    fmt.Println("---break跳出外部循环---")
    OutLoop1:
    for i := 1; i <= 3; i++ {
        for j := 1; j <= 3; j++ {
            if j == 3 {
                break OutLoop1
            }
            fmt.Println([]int{i, j})
        }
    }

    fmt.Println("---continue跳出外部循环---")
    OutLoop2:
    for i := 1; i <= 3; i++ {
        for j := 1; j <= 4; j++ {
            if j == 3 {
                continue OutLoop2
            }
            fmt.Println([]int{i, j})
        }
    }

    /*
    1.go语言的 goto 语句可以无条件地转移到过程中指定的行。
    2.goto 语句通常与条件语句配合使用,可用来实现条件转移, 构成循环,跳出循环体等功能。
    3.在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
    */
    //案例一
	var a int = 10
    LOOP:
	for a < 20 {
		if a == 15 {
			/* 跳过迭代 */
			a = a + 1
			goto LOOP
		}
		fmt.Printf("a的值为 : %d\n", a)
		a++
	}

    //案例二
    n := 30
    fmt.Println(1)
    fmt.Println(2)
    if n > 20 {
        goto label1 //转移到指定的label1行
    }
    fmt.Println(3)
    fmt.Println(4)
    fmt.Println(5)
    label1:
    fmt.Println(6)
    fmt.Println(7)

    /* for...range...
    for range每次获取一对值,下标和数值。for只能通过下标获取元素。
    for range可以遍历切片、数组、字符串、Map、Channel
    建议不需要后去下标时舍弃下标,提高性能
    */
    // 1. 数组的循环
    strs := []string{"Hello", "World", "I", "Love", "You!"}
    for i, str := range strs {
        fmt.Println("Hello, Strs:", i, str)
    }
    // 2. map的循环
    strMap := map[string]string {
        "a":"Hello",
        "b":"The",
        "c":"World",
    }
    fmt.Println(strMap)

    /*
    需要注意的是:
    如for index, value := range arrayTest {...}遍历数组时。在for循环中直接对value进行修改或者赋值,实际数组中的元素不会发生改变。
    原因是for range获取的value是将对象中的元素copy了一份。
    所以如果实际需要修改元素时,可以使用下标找到对应元素,再进行修改。
    */
    for index, value :=  range strMap {
        fmt.Println(index,value)
        //fmt.Println(strMap[index])
        strMap["c"] = "周杰伦" //引用类型,改变根据下表修改值,会影响原来数组
    }
    fmt.Println(strMap)

}