• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go语言基础之流程控制

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

流程控制是每种语言控制逻辑走向和执行顺序的重要部分.

Go语言中最常用的流程控制有 iffor,而switchgoto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制.

if else (分支结构)

if条件判断基本语法

Go语言中if条件判断的格式如下:

package main

import "fmt"

func main()  {
	var age = 18
	if age == 18{
		fmt.Println("春生成年人了 ")
	}else if age < 18{  // 这个大括号的位置 不能变
		fmt.Println("春生还没有成年")
	}else { // 这个大括号的位置 不能变
		fmt.Println("春生超过18了成为北京吴彦祖了。")
	}

}

当表达式1的结果为true时,执行分支1,否则判断表达式2,如果满足则执行分支2,都不满足时,则执行分支3。 if判断中的else ifelse都是可选的,可以根据实际需要进行选择。

Go语言规定与if匹配的左括号{必须与if和表达式放在同一行,{放在其他位置会触发编译错误。 同理,与else匹配的{也必须与else写在同一行,else也必须与上一个ifelse if右边的大括号在同一行。

举个例子:

func ifDemo1() {
	score := 65
	if score >= 90 {
		fmt.Println("A")
	} else if score > 75 {
		fmt.Println("B")
	} else {
		fmt.Println("C")
	}
}

if条件特殊写法

if条件判断还有一种特殊写法,可以在if表达式之前添加一个执行语句,在根据变量值判断:·

package main

import "fmt"

func main()  {
	if age:=18; age == 18{  // 可以看到 我if表达式里面声明了一个 age 当前着age 只有if 代码块中存在 不会在函数的作用域中
		fmt.Println("春生成年人了")
	}else if age < 18{
		fmt.Println("春生还没有成年")

	}else {
		fmt.Println("春生超过18了成为北京吴彦祖了。")
	}
}

思考题: 上下两种写法的区别在哪里?

for(循环结构)

Go 语言中的所有循环类型均可以使用for关键字来完成。

for 循环的基本格式如下:

for 初始语句;条件表达式;结束语句{
    循环体语句
}
for i:=0;i < 10;i++{
  fmt.Println(i)
}

条件表达式返回条件表达式返回true时循环体不停地进行循环、直到条件表达式返回false时自动退出循环

package main

import "fmt"

func ForDemo()  {
	for i:=0;i < 10;i++{
		fmt.Println(i)
	}
}

func main()  {
	ForDemo()

}

结果:

0
1
2
3
4
5
6
7
8
9

Process finished with exit code 0

for循环的初始语句可以被忽略,但是初始语句后的分号必须要写,例如:

func forDemo2() {
	i := 0
	for ; i < 10; i++ {
		fmt.Println(i)
	}
}

for循环的初始语句和结束语句都可以省略,例如:

func forDemo3() {
	i := 0
	for i < 10 {
		fmt.Println(i)
		i++
	}
}

这种写法类似于其他编程语言中的while,在while后添加一个条件表达式,满足条件表达式时持续循环,否则结束循环。

无限循环

for {
    循环体语句
}

for循环可以通过breakgotoreturnpanic语句强制退出循环。

for range (建值循环)

Go语言中可以使用 for range 便利数组、切片、字符串、map及通道(channel).通过for range遍历的返回值

有以下规律:

  1. 数据、切片、字符串返回值返回索引和值
  2. map返回键和值
  3. 通道(channel)只返回通道内的值

代码:

package main

import "fmt"

func ForDemo()  {
	// for range 字符串
	var s1 = "北京吴彦祖"

	for i,v := range s1 { // rune 类型 utf-8
		fmt.Println(i,v) // i: 是索引 v: 是值
	}

	var m = map[string]string{
		"name":"春生",
		"age":"18",
	}
	//  map
	for k,v := range m{ // rune 类型 utf-8
		fmt.Println(k,v)  // k :是建 "name" v:是值 "春生 "
	}
	// 数组 []string

	var Array =  []int{1,2,3,4,5}

	for i,v:= range Array{
		fmt.Println(i,v) // i:是索引 v:是值
	}

}

func main()  {
	ForDemo()

}

结果:

0 21271
3 20140
6 21556
9 24422
12 31062

name 春生
age 18

0 1
1 2
2 3
3 4
4 5

Process finished with exit code 0

switch case

使用 switch语句可方便的对大量的值进行条件判断.

package main

import "fmt"

func SwitchDemo()  {
	age := 18
	switch age {
	case 18:
		fmt.Println("春生成年了")
	case 19:
		fmt.Println("春生比成年还打了一岁")
	default:
		fmt.Println("春生不管怎么样都是人")
	}

}

func main()  {
	SwitchDemo()

}

注意: Go语言规定每个 stitch 只能有一个 default 分支.

一个分支可以有多个值,多个case值中间使用英文逗号分隔.

package main

import "fmt"

func SwitchDemo()  {
	switch n := 7; n {
	case 1,3,5,7:
		fmt.Println("奇数")
	case 2,4,6,8:
		fmt.Println("偶数")
	}
}

func main()  {
	SwitchDemo()

}

分支还可以使用表达式,这个时候switch语句后面不需要在跟判断变量.例如:

package main

import "fmt"

func SwitchDemo()  {
	var age = 30
	switch {
	case age < 25:
		fmt.Println("好好学习天天向上")
	case age > 25 && age >35:
		fmt.Println("好好工作")
	case age > 60:
		fmt.Println("好好享受生活")
	default:
		fmt.Println("活着真好")

	}

}

func main()  {
	SwitchDemo()

}

fallthrough

fallthrough语法可以执行满足条件下的case的下一个case,

是为了兼容C语言中的case 设计

package main

import "fmt"

func switchDemo()  {
	var s = 1
	switch  {
	case s == 1:
		fmt.Println(1)
		fallthrough
	case s == 2:
		fmt.Println(2)
	case s == 3:
		fmt.Println(3)
	case s == 4:
		fmt.Println(4)
	default:
		fmt.Println("....")
	}

}


func main()  {
	switchDemo()

}

结果:

1
2

Process finished with exit code 0

可以看到 结果出现了1 和 2。明明 2 不满足结果 却出现了 这就是fallthrough 无条件的满足下一个 case

goto (跳转指定标签)

goto语句通过标签进行代码间的无条件跳转.

goto语句可以在快速跳出循环、避免重复退出上有一定的帮助.

Go语言中使用goto语句能简化一些代码的实现过程.

例如双层嵌套for循环要推出时:

package main

import "fmt"

func GotoDemo(){
	var boolbreak = false
	for i:=0;i<10;i++{
		for j:=0;j<10;j++{
			if j == 2{
				boolbreak = true
				break
			}

		fmt.Println(i,j)
		}
		if boolbreak {
			break
		}
	}

}

func main()  {
	GotoDemo()
}

使用goto语句能简化代码:

func gotoDemo2() {
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				// 设置退出标签
				goto breakTag
			}
			fmt.Printf("%v-%v\n", i, j)
		}
	}
	return
	// 标签
breakTag:
	fmt.Println("结束for循环")
}

break (跳出循环)

break 语句可以结束 forswitchselect 的代码块.

break 语句还可在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的 for

switchselect 的代码块上.举个例子:

package main

import "fmt"

func GotoDemo(){
BREAKDEMO1:
	for i:=0;i<10;i++{
		for j:=0;j<10;j++{
			if j == 2{
				break BREAKDEMO1
			}
		fmt.Println(i,j)
		}

	}

}


func main()  {
	GotoDemo()
}

结果:

0 0
0 1

Process finished with exit code 0

可以看到 外层循环也退出了.

continue (继续下次循环)

continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在 for循环内使用.

continue 语句后添加标签时,表示开始标签对应的循环.例如:

func continueDemo() {
forloop1:
	for i := 0; i < 5; i++ {
		// forloop2:
		for j := 0; j < 5; j++ {
			if i == 2 && j == 2 {
				continue forloop1
			}
			fmt.Printf("%v-%v\n", i, j)
		}
	}
}

练习题

  1. 编写代码打印9*9乘法表
package main

import "fmt"

func Demo(){

	for i:=1;i<10;i++{
		for j:=1;j<10;j++{
			fmt.Printf("%d * %d = %d \t",i,j,i*j)
		}
		fmt.Println()

	}

}

func main()  {
	Demo()
}

结果:

1 * 1 = 1       1 * 2 = 2       1 * 3 = 3       1 * 4 = 4       1 * 5 = 5       1 * 6 = 6       1 * 7 = 7       1 * 8 = 8       1 * 9 = 9       
2 * 1 = 2       2 * 2 = 4       2 * 3 = 6       2 * 4 = 8       2 * 5 = 10      2 * 6 = 12      2 * 7 = 14      2 * 8 = 16      2 * 9 = 18      
3 * 1 = 3       3 * 2 = 6       3 * 3 = 9       3 * 4 = 12      3 * 5 = 15      3 * 6 = 18      3 * 7 = 21      3 * 8 = 24      3 * 9 = 27      
4 * 1 = 4       4 * 2 = 8       4 * 3 = 12      4 * 4 = 16      4 * 5 = 20      4 * 6 = 24      4 * 7 = 28      4 * 8 = 32      4 * 9 = 36      
5 * 1 = 5       5 * 2 = 10      5 * 3 = 15      5 * 4 = 20      5 * 5 = 25      5 * 6 = 30      5 * 7 = 35      5 * 8 = 40      5 * 9 = 45      
6 * 1 = 6       6 * 2 = 12      6 * 3 = 18      6 * 4 = 24      6 * 5 = 30      6 * 6 = 36      6 * 7 = 42      6 * 8 = 48      6 * 9 = 54      
7 * 1 = 7       7 * 2 = 14      7 * 3 = 21      7 * 4 = 28      7 * 5 = 35      7 * 6 = 42      7 * 7 = 49      7 * 8 = 56      7 * 9 = 63      
8 * 1 = 8       8 * 2 = 16      8 * 3 = 24      8 * 4 = 32      8 * 5 = 40      8 * 6 = 48      8 * 7 = 56      8 * 8 = 64      8 * 9 = 72      
9 * 1 = 9       9 * 2 = 18      9 * 3 = 27      9 * 4 = 36      9 * 5 = 45      9 * 6 = 54      9 * 7 = 63      9 * 8 = 72      9 * 9 = 81      

Process finished with exit code 0

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go 如何利用 Linux 内核的负载均衡发布时间:2022-07-10
下一篇:
Go--一致性哈希算法发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap