程序流程控制

顺序结构

就是一直走下去;

分支结构

单分支结构

就是只有一个if判断语句

1
2
3
4
5
6
age:=0
fmt.Println("input your age ")
fmt.Scanln(&age)
if age>18{
fmt.Println("都成年了,为何还没有女友")
}

在判断中判断语句的括号有没有都是一样的,但是在for循环里面括号必须有,但是if循环我们尽量不要写括号

双分支结构和多分支

就是有if和else的判断

1
2
3
4
5
6
7
8
9
10
age := 0
fmt.Println("input your age ")
fmt.Scanln(&age)
if age > 18&&age<60 {
fmt.Println("都成年了,为何还没有女友")
}else if age>60 {
fmt.Println("你个老不死的")
}else {
fmt.Println("你还在小")
}

注意一点,else必须写在**==}==**的后面,不然会报错

switch

1
2
3
4
5
6
7
8
9
10
11
age := 0
fmt.Println("input your age ")
fmt.Scanln(&age)
switch age {
case 18,20:
fmt.Println("太大了");fmt.Println("LSP")
case 0:
fmt.Println("太小了")
default:
fmt.Println("dont't know")
}

case后面不用再写 break默认会有,,如果case有多个情况,使用逗号分割,后面的执行语句有多个使用分号隔开,条件switch和结果case之间的数据类型要完全一致,不一致使用强制类型转换

case语句的后面条件不能重复

switch后面不加条件的话,就会把我们的一个switch语句当成一个if-else语句使用

1
2
3
4
5
6
7
8
switch  {
case age>18:
fmt.Println("太大了");fmt.Println("LSP")
case age==20:
fmt.Println("太小了")
default:
fmt.Println("dont't know")
}

不同点:fallthrough

匹配第一个以后,不会退出直接再向下运行下面那个语句,例如下面这个语句机会输出第一行和第二行,fallthrough强制执行后面的第一个case代码。==不能再最后一个语句或者default后面加上fallthrough==

1
2
3
4
5
6
7
8
9
switch  {
case age>18:
fmt.Println("太大了,第一次")
fallthrough
case age==20:
fmt.Println("太小了,第二次")
default:
fmt.Println("dont't know")
}

不同点2:可以判断interface类型

1
2
3
4
5
6
7
8
9
var v interface{}
switch v.(type) {
case int:
fmt.Println("int")
case func(int) float64:
fmt.Println("func(int) float64")
default:
fmt.Println("未知类型")
}

if和switch比较

  1. 如果判断的具体数值不多,并且都是简单数据类型使用switch,因为简洁;高效
  2. 对区间判断为bool的尽量使用if,if使用的更多

循环结构

for循环

1
2
3
4
c:=1
for i:=0;i<10;i++{
fmt.Println(c)
}

for后面的语句不能加上括号,并且是里面定义的变量是局部变量,只能再循环内部使用,其他的变体和java一样,赋值写在外面,或者i++写在循环里面

无限循环:

不写条件就是的for循环就是无限循环,退出就是break

1
2
3
4
5
6
7
8
c:=1
for {
fmt.Println(c)
c++
if c==5{
break
}
}

使用for-range遍历字符串或者数组

1
2
3
4
5
6
c:="abscdg"
for index,value:=range(c){
fmt.Printf("%d \t",index)
fmt.Printf("%c \t",value)
fmt.Println()
}

range()返回的数据,一个是index,下标,一个是value,字符(char|byte),不想使用下标,就使用下划线忽略,就可以只使用字符了

特殊情况:遍历一个带有中文字符的字符串,使用[]rune,切片转换字符串

1
2
3
4
5
str:="我爱你中国"
str1:=[]rune(str)
for index,value:=range(str1){
fmt.Printf("%d,%c \n",index,value)
}

输出结果:

1
2
3
4
5
0,我
1,爱
2,你
3,中
4,国

这里又发现一个新东西,rune于是我又去网上找一些教程,知道了一点关于这个东西的信息

1
2
3
4
str:="我爱你中国"
str1:=[]rune(str)
fmt.Println(len(str))
fmt.Println(len(str1))

他是专门拿来处理字符的一种数据类型,实际上就是另一种 int32,我们使用len()去求字符串长度,求的是他的底层长度,就是一个中文字符占用3个字节,所以5个字就是15.所以我们再处理字符串的时候,尽量使用rune

while和do…while循环

GO语言里面没有以上两种循环

while是先判断在执行,do…while是先执行在判断,所以我们可以根据这一个特性改写for循环

双重循环打印一个9*9乘法表,简单:

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

break和continue

用法和以前一样;

break直接退出循环,continue只是退出这次循环,但是外层循环并未结束

goto跳转控制语句

软件考试里面说过限制使用goto,所以不看了

return

  1. return在普通函数中,表示跳出该函数,不在执行后面的东西,如果函数没有指明返回值类型,可以直接返回空,但是如果指明了,那么就要返回指定类型
  2. 在main函数里面表示终止函数