流程控制

package main

import "fmt"

func main() {

	var a int = -1
	if a > 0 {
		fmt.Println("hello")
	}else if a == 0{        //可以 if   else if  else 做条件判断
		fmt.Println("world")
	}else{
		fmt.Println("haha")
	}

}

func main()  {
	//if后面还可以跟操作
	if err:=Connect();err != nil{

	}

}

func main()  {
	var a string = "hello"
	switch a {
	//每个case均是字符串格式
	case "hello":
		fmt.Println(111)
	case "world":
		fmt.Println(222)
	//每个switch 只能有一个default分支
	default:
		fmt.Println("无论如何都会执行的")

	}

}

//一分支多个值,多个case要放到一起的时候
func main()  {
	var a = "hello"
	switch a {
	//每个case均是字符串格式,不同的case表达式用逗号分隔
	//代表当a是 hello 或者 world 的时候,执行逻辑
	case "hello","world":
		fmt.Println(111)
	case "other":
		fmt.Println(222)
	//每个switch 只能有一个default分支
	default:
		fmt.Println("无论如何都会执行的")

	}

}

//分支表达式
//case后不仅仅可以是常量,还可以和if一样添加表达式
func main()  {
	var a = 11
	switch  {  //注意的一点是,在switch后面不再加判断变量

	case a>1:
		fmt.Println(111)
	case a > 1 && a < 20:
		//case在第一个条件达成之后就跳出判断了,后面的判断将不再执行,假如前两个case都没有达成条件,将会执行最后的default
		fmt.Println(222)
	//每个switch 只能有一个default分支
	default:
		fmt.Println("无论如何都会执行的")

	}

}
//case是一个独立的代码块,执行完毕后不会像C那样紧接着下一个case执行,
//为了兼容一些一直代码,便加入了  fillthrough关键字来实现这一功能 fillthrough之后,会执行下个case 不论是否匹配
func main()  {
	var s = "hello"

	switch  {
	case s == "hello":
		fmt.Println("hello")
		fallthrough
	case s!="world":
		fmt.Println("紧接着要干的事")
	}

}

//goto 通过标签进行代码间的无条件跳转。goto语句可以快速的跳出循环,避免重复
//使用goto退出多层循环




func main() {
	// for 初始语句;条件表达式;结束语句
	// 初始语句是在第一次循环前执行的语句,一般用于变量的初始化,如果在这里初始化了变量,那么变量的作用域会局限在这个for范围内
	// 初始语句时可以被忽略的,但是初始语句后的  ;  必须写,
	//for i := 1; i < 10; i++ {
	i := 1 //在外部声明
	for ; i < 10; i++ {
		//循环体不停循环,知道条件表达式返回false自动退出循环,
		fmt.Println("status", i)
		if i == 3 {
			break
			//for循环可以通过break,goto,return,panic强制退出循环
		}

		if i == 9 {
			fmt.Println("this is target")
		}
	}

}

// 无限循环,注意,需要有可控的退出循环的开关
func main() {

	var i int
	// 忽略for的所有语句,此时for循环就是无限循环
	for {

		if i == 3 {
			break

		}
		// 将i++ 从for 的结束语句放到函数体的末尾,作用是一样的
		i++
	}

}

// 只有一个循环条件的循环,将if判断整合到for中
func main() {

	var i int
	//在for中使用if{}判断表达式进行判断,
	//相当于其他语言中的whild,在while后添加一个判断条件表达式,满足条件的继续被执行,不满足就停止循环
	for i >= 3 {

		//if i == 3 {
		//	break
		i++
	}

}

//
//for的结束语句,每次循环结束时都会执行语句
//如过循环被break goto return panic 等语句强制退出,结束语句时不会被执行的
func main() {

	var i int
	//在for中使用if{}判断表达式进行判断,
	//相当于其他语言中的whild,在while后添加一个判断条件表达式,满足条件的继续被执行,不满足就停止循环
	for i >= 3 {
		break

	}
	i++
	//在i大于等于三的时候,i就不会自增了

}

/*键值循环,for range
for range
	数组 切片 字符串返回索引和值
	map 返回键和值
	channel 只返回通道内的值*/

//遍历数组 切片 字符串
func main() {

	for index, value := range []int{5, 4, 3, 2, 1} {
		fmt.Printf("index:%d  value:%d\n", index, value)

	}

}

//遍历map
//遍历map,遍历输出的键值是无序的,如果需要有序的键值输出,需要对结果进行排序
func main()  {
	//键为string型 值为int型
	m := map[string] int{
		"yy":10,
		"bb":12,   //注意,这里的逗号必须有,不然会报错,和json数据结构正好相反,json是末尾加上,会报错
	}

	for key,value := range m{
		fmt.Println(key,value)
		//yy 10
		//bb 12
	}
}


//遍历chanel,只输出管道内的类型对应的数据
func main()  {
	//创建一个整型类型的通道
	channel := make(chan int)
	//启动一个goroutine,
	go func() {
		//给管道中填充数据
		channel <- 1
		channel <- 2
		channel <- 3
		//关闭管道
		close(channel)
	}()//声明完立马执行
	//对管道进行遍历,知道管道关闭
	for v:= range channel{
		fmt.Println(v)
	}
}


//总结:for 包含了初始化语句 条件表达式  结束语句三个部分 这三个部分均可省略
//在需要时,可以使用匿名变量对for range取到的值做取舍
posted @ 2019-09-07 17:31  π=3.1415926  阅读(163)  评论(0编辑  收藏  举报