golang分支与循环

if分支语句

普通if

resp, err := http.Get(url)
if err != nil {
  log.Fatal(fmt.Sprintf("请求异常, url: %s", url))
} else if {
} else {
}

赋值if

var nameList []string
if err := json.Unmarshal([]byte(jsonData), &nameList); err != nil {
  log.Fatal(err)
}

switch分支语句

普通switch

func main()  {

	// 普通switch
	switch 2 {
	case 1:
		fmt.Println(1)
	case 2:
		fmt.Println(2)
	case 3, 4, 5:
		fmt.Println("3, 4, 5")
	default:
		fmt.Println("default")
	}

判断switch

很神奇,可以代替多个if条件判断

// 省略变量, 相当于作用于bool类型
func main() {

	age := 18
	switch {
    // 条件为true是 执行内容
	case age > 10:
		fmt.Println("age > 10")
	case age > 8:
		fmt.Println("age > 8")
	default:
		fmt.Println("default")
	}
    }
}

console

age > 10

赋值switch

func main()  {

	switch name := "shenzhen"; name {
	case "shenzhen":
		fmt.Println("shenzhen")
	case "foshan":
		fmt.Println("foshan")
	default:
		fmt.Println("default")
	}
}

带跳出的switch

golang的switch case自带一个break
如果需要向下执行可以使用fallthrough

func main()  {

	// break 强制跳出, 不执行 "gd3"
	switch name := "gd"; name {
	case "gd":
		fmt.Println("gd1")
		fmt.Println("gd2")
		break
		fmt.Println("gd3")
	}

	fmt.Println("-0----")

	switch name := "sz"; name {
	case "sz":
		fmt.Println("深圳1")
		fmt.Println("深圳2")
		fmt.Println("深圳3")
		// 执行完 case = "sz"后, 不跳出, 继续执行 case = "gz"
		fallthrough
	case "gz":
		fmt.Println("广州")
	}
}

console: 

gd1
gd2
-0----
深圳1
深圳2
深圳3
广州

for循环语句

for (init; condition; post) {}

Init: 初始化,只执行一次
condition: bool类型,

普通for

func main()  {

	for i := 0; i < 5; i ++ {
		fmt.Println(i)
	}
}

外部初始化for

func main() {
	i := 0
	for i <= 5 {
		fmt.Println(i)
		i ++
	}
}

死循环

func main() {
	for {
		fmt.Println()
	}
}

for循环中的跳转

func main() {

	for i := 1; i <= 5; i++ {
		// 跳出整个循环
		if i == 4 {
			break
		}

		// 跳出当前循环进行下一次循环
		if i < 3 {
			continue
		}
		fmt.Println(fmt.Sprintf("i = %v", i))
	}

	// 多层循环可通过定义标签跳转, 在for循环中break和goto都可以完成
	lable:
	for i := 1; i <= 5; i++ {
		for j := i; j <= 5; j++ {
			if i == j {
				break lable
			}
			if j > 3 {
				goto lable
			}
		}
	}
}

for循环实现冒泡

升序冒泡
func main() {

	arr := []int{1, 2, 5, 2, 22, 1}
	
	// len(arr) - 1, 对比时, 最后一位必须要对比
	for i := 0; i < len(arr) - 1; i++ {
		// j := i + 1, 对比时, 内层for循环无需从第一个开始比对, 即第一个(外层for)和第二个(内层for)比对
		// len(arr) 对比时, 最后一位参与上一层for循环的对比
		for j := i + 1; j < len(arr); j++ {
			if arr[i] > arr[j] {
				// 如果当前的数字, 大于后面的数字, 就把当前数字往后移
				arr[i], arr[j] = arr[j], arr[i]
			}
		}
	}

	for _, num := range arr {
		fmt.Println(num)
	}
}


console:

1
1
2
2
5
22

return跳出语句

func main() {

	returnTest(1)
}

func returnTest(i uint) {

	if i > 0 {
		return
	}
	fmt.Println("i <= 0")
}