前言

对于条件,选择,循环各个语言大差不差 这里就简单讲一下 如何使用

条件

package main

import "fmt"

func main() {
	a := 20
	if a > 0 {
		fmt.Println("大于0")
	}else {
		fmt.Println("小于0")
	}
}

结果

大于0

选择

switch 和 type switch

switch 后跟变量,case 后跟常量,只要变量值和常量匹配,就执行该分支下的语句。当然switch语句会逐个匹配case语句,一个一个的判断过去,直到有符合的语句存在如果没有一个是匹配的,就执行default后的语句。注意switch后可以跟空

package main

import "fmt"

func main() {
	name := ""

	switch name {
	case "zhuzhu":
		fmt.Println("zhuzhu")
	case "nanna":
		fmt.Println("nanan")
	case "liangliang":
		fmt.Println("liang")
	default:
		fmt.Println("默认")

	}

	number := 70

	//如果没有一个是匹配的,就执行default后的语句。
	//注意switch后可以跟空,如上
	//switch {
	//这样case就必须是表达式。
	switch {
	case number >= 90:
		fmt.Println("优秀")
	case number >= 80:
		fmt.Println("良好")
	case number >= 60:
		fmt.Println("凑合")
	default:
		fmt.Println("太搓了")
	}


	//有一个流传于坊间的神秘玩法,可以用switch语句来判断传入变量的类型,然后做一些羞羞的事情。
	//x是一个未知类型的变量,switch t := x.(type)  用这个方式来赋值,t就是有确定类型的变量。
	//type switch只能用于接口的变量。

	var x interface{} //定义接口类型
	x = "abc" //实现接口类型  实现为 string
	switch t := x.(type) {
	case int:
		fmt.Println(t)
	case float64:
		fmt.Println("float64" , t)
	default:
		fmt.Println("未知类型")

	
	}




}

结果

默认
凑合
未知类型

想象一个场景当你在调用第三方的接口,却发现对方的接口发生了微调,原来的int类型,被转换成了string类型,你必须写出兼容两种方式的代码来解析json。那么这个时候,type switch就派上了用场。

循环

循环的三种形式和break,continue

为了方便 我把解释放在注解里面

package main

import "fmt"

func main() {

	nums := []int{1, 2, 3, 4, 5, 6}

	//for 循环方式 1 和 c++、java 相似
	for i := 0; i < len(nums); i++ {
		fmt.Println(i)
	}

	fmt.Println("----------------")
	//for 循环方式 2 省略赋值和++
	a, b := 1, 5
	for a < b {
		fmt.Println(a)
		a++
	}
	fmt.Println("----------------")
	//for 循环方式 3 迭代
	//优点:不用引入无意义的变量
	//缺点:不是直接索引,如果数据量极大会有性能损耗

	for index, value := range nums {
		fmt.Printf("key: %v  value: %v  \n", index, value)

	}
	//当然,你可以把方式 3 中 index 去掉,用_忽略掉key 或者 用_忽略掉value
	for _, value := range nums {
		fmt.Printf(" value: %v  \n", value)

	}
	//如果你想忽略掉 value,直接用 key也是可以的,这样就消除了迭代方式的缺点!
	//当然 这样只默认输出第一个也就是key 所以取value还是需要用 nums[index]
	for index := range nums {
		fmt.Printf("value: %v  \n", nums[index])

	}
	//死循环
	//go 里面没有while 要无限循环的话 可以使用
	//这里为了演示加入了break
	for {
		break
	}
	fmt.Println("------break、continue 测试----------")
	//break、continue
	i := 0
	for {
		i++
		if i >= 5 {
			fmt.Println("跳出循环")
			break
		}
		if i == 2 {
			fmt.Println("触发continue ")
			continue
		}

		fmt.Printf("输出 i : %v  \n", i)

	}

}

结果

0
1
2
3
4
5
----------------
1
2
3
4
----------------
key: 0  value: 1  
key: 1  value: 2  
key: 2  value: 3  
key: 3  value: 4  
key: 4  value: 5  
key: 5  value: 6  
 value: 1  
 value: 2  
 value: 3  
 value: 4  
 value: 5  
 value: 6  
value: 1  
value: 2  
value: 3  
value: 4  
value: 5  
value: 6  
------break、continue 测试----------
输出 i : 1  
触发continue 
输出 i : 3  
输出 i : 4  
跳出循环

Process finished with exit code 0

-----白雪公主嫁给王子之后总要生活,三十年后也有脂肪下垂的一天;睡美人几百年没动过地儿,去拯救她的王子不先吹吹灰怎么能下的去嘴;青蛙王子被变成青蛙那么多年,在遇上自己的公主之前究竟是吃什么过来的;穿上红舞鞋的女孩无法停下跃动的舞步只能跳舞至死,但在累死之前她要想上厕所是怎么解决的
你看,其实我们的童年很脆弱