Golang--流程控制

1、分支结构

1.1 if分支

单分支

语法:
if 条件表达式 {

逻辑代码

}

  • 当条件表达式为true时,就会执行代码块的代码。
  • 条件表达式左右的()可以不写,也建议不写
  • if和表达式中间,一定要有空格
  • 在Golang中,{}是必须有的,就算你只写一行代码。
  • 在golang里,if后面可以并列的加入变量的定义
Go 复制代码
package main  

import (  
	"fmt"
)  

func main() {  
	if true {
		fmt.Println("hello")
	}
}
Go 复制代码
package main  

import (  
	"fmt"
)  

func main() {  
	if a,b := 1,2; a < b {
		fmt.Println("hello")
	}
}

双分支

正确语法​:

if 条件表达式 {

逻辑代码1

} else {

逻辑代码2

}

当条件表达式成立,即执行逻辑代码1,否则执行逻辑代码2。{}也是必须有的。

错误语法:

if 条件表达式 {

逻辑代码1

}

else {

逻辑代码2

}

​​​​​​

Go 复制代码
package main  

import (  
	"fmt"
)  

func main() {  
	if a,b := 10,20; a > b{
		fmt.Println("a > b")
	}else{
		fmt.Println("a < b")
	}
}

多分支

语法:

if 条件表达式1 {

逻辑代码1

} else if 条件表达式2 {

逻辑代码2

}

.......

else {

** 逻辑代码n**

}

Go 复制代码
package main  

import (  
	"fmt"
)  

func main() {  
	if a,b := 10,10; a > b{
		fmt.Println("a > b")
	}else if c := 100; a < c{
		fmt.Println("a < c")
	}else
	{
		fmt.Println("a == b")
	}
}

1.2 switch分支

语法:

switch 表达式 {

case 值1,值2,.....:

语句块1

case 值3,值4,...:

语句块2

....

default:

语句块

}

注意:

  • switch后的表达式可以是常量值、变量、一个有返回值的函数调用等*
  • case后面的值如果是常量值(字面量),则要求不能重复
  • case后的各个值的数据类型,必须和 switch 的表达式数据类型一致
  • case后面可以带多个值,使用逗号间隔。比如 case 值1,值2...*
  • case后面不需要带break* (C语言如果没有break,就会执行后面的case)
  • default语句不是必须的,位置也是随意的
  • switch后也可以不带表达式,当做if分支来使用*
  • switch后也可以直接声明/定义一个变量,分号结束,不推荐*
  • switch穿透,利用fallthrough关键字,如果在case语句块后增加fallthrough ,则会继续执行下一个case,也叫switch穿透。
Go 复制代码
package main
import "fmt"
func main(){
        //实现功能:根据给出的学生分数,判断学生的等级:
        // >=90  -----A
        // >=80  -----B
        // >=70  -----C
        // >=60  -----D
        // <60   -----E
        //给出一个学生分数:
        var score int = 187
        //根据分数判断等级:
        //switch后面是一个表达式,这个表达式的结果依次跟case进行比较,满足结果的话就执行冒号后面的代码。
        //default是用来"兜底"的一个分支,其它case分支都不走的情况下就会走default分支
        //default分支可以放在任意位置上,不一定非要放在最后。
        switch score/10 {
                case 10 :
                        fmt.Println("您的等级为A级")
                case 9 :
                        fmt.Println("您的等级为A级")
                case 8 :
                        fmt.Println("您的等级为B级")
                case 7 :
                        fmt.Println("您的等级为C级")
                case 6 :
                        fmt.Println("您的等级为D级")
                case 5 :
                        fmt.Println("您的等级为E级")
                case 4 :
                        fmt.Println("您的等级为E级")
                case 3 :
                        fmt.Println("您的等级为E级")
                case 2 :
                        fmt.Println("您的等级为E级")
                case 1 :
                        fmt.Println("您的等级为E级")
                case 0 :
                        fmt.Println("您的等级为E级")
                default:
                        fmt.Println("您的成绩有误")
        }
        
}

2、循环结构

2.1 for循环

for循环语法:
for 初始表达式; 布尔表达式; 迭代因子 { //注意:这里迭代因子只能有一个
循环体;
}

注意:

  1. for的初始表达式 不能用var定义变量的形式,要用:=
  2. for循环实际就是让程序员写代码的效率高了,但是底层该怎么执行还是怎么执行的,底层效率没有提高,只是程序员写代码简洁了而已
Go 复制代码
package main  

import (  
	"fmt"
)  

func main() {  
	for i,j := 1,2; i < 10 && j < 10; i++{
		fmt.Println(i * j)
		j++
	}
}

for循环类似while的用法:

cpp 复制代码
package main  

import "fmt"  

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

for实现无线循环:

Go 复制代码
package main  

import "fmt"  

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

2.2 for range

for range结构是Go语言特有的一种的迭代结构,for range 可以遍历数组、切片、字符串、map 及通道,for range 语法上类似于其它语言中的 foreach 语句,一般形式为:
for key, val := range coll {
...
}

Go 复制代码
package main  

import "fmt"  

func main() {  
    // 遍历数组  
    arr := []int{1, 2, 3, 4, 5}  
    for i, v := range arr {  
        fmt.Printf("Index: %d, Value: %d\n", i, v)  
    }  

    // 遍历字符串  
    str := "hello"  
    for i, v := range str {  
        fmt.Printf("Index: %d, Character: %c\n", i, v)  
    }  
}

2.3 关键字

2.3.1 break

  • break可以结束正在执行的循环(break的作用结束离它最近的循环)
  • **break 标签,**结束指定标签对应的循环,可以做到一次跳出多重循环(注意:如果那个标签没有使用到 的话,那么标签不用加,否则报错:定义未使用)

没有使用标签(只跳出最近的一次循环):

Go 复制代码
package main
import "fmt"
func main(){
        //双重循环:
        for i := 1; i <= 5; i++ {
                for j := 2; j <= 4; j++ {
                        fmt.Printf("i: %v, j: %v \n",i,j)
                        if i == 2 && j == 2 {
                                break
                        }
                }
        }
        fmt.Println("-----ok")
}


使用标签(可以做到一次break跳出多层循环):

Go 复制代码
package main
import "fmt"
func main(){
        //双重循环:
        label2:
        for i := 1; i <= 5; i++ {
                for j := 2; j <= 4; j++ {
                        fmt.Printf("i: %v, j: %v \n",i,j)
                        if i == 2 && j == 2 {
                                break label2   //结束指定标签对应的循环
                        }
                }
        }
        fmt.Println("-----ok")
}

2.3.2 continue

  • continue结束本次循环,继续下一次循环(continue的作用是结束离它近的那个循环,继续离它近的那个循环,即在同一层循环中)
  • **continue 标签,**结束指定标签对应的本次循环,可以做到一次跳过指定标签对应的一次循环,并继续下一次循环(注意:如果那个标签没有使用到的话,那么标签不用加,否则报错:定义未使用)

没有使用标签:

Go 复制代码
package main
import "fmt"
func main(){
        //双重循环:
        for i := 1; i <= 5; i++ {
                for j := 2; j <= 4; j++ {			
                        if i == 2 && j == 2 {
                                continue
                        }
                        fmt.Printf("i: %v, j: %v \n",i,j)
                }
        }
        fmt.Println("-----ok")
}


使用标签:

Go 复制代码
package main
import "fmt"
func main(){
        //双重循环:
        label:
        for i := 1; i <= 5; i++ {
                for j := 2; j <= 4; j++ {			
                        if i == 2 && j == 2 {
                                continue label
                        }
                        fmt.Printf("i: %v, j: %v \n",i,j)
                }
        }
        fmt.Println("-----ok")
}

2.3.3 goto

  • Golang的 goto 语句可以无条件地转移到程序中指定的行。
  • goto语句通常与条件语句配合使用。可用来实现条件转移.
  • 在Go程序设计中一般不建议使用goto语句,以免造成程序流程的混乱。
Go 复制代码
package main
import "fmt"
func main(){
        fmt.Println("hello golang1")
        fmt.Println("hello golang2")
        if 1 == 1 {
                goto label1 //goto一般配合条件结构一起使用
        }
        fmt.Println("hello golang3")
        fmt.Println("hello golang4")
        fmt.Println("hello golang5")
        fmt.Println("hello golang6")
        label1:
        fmt.Println("hello golang7")
        fmt.Println("hello golang8")
        fmt.Println("hello golang9")
}

2.3.4 return

直接结束当前函数:

Go 复制代码
package main
import "fmt"
func main(){
        for i := 1; i <= 100; i++ {
                fmt.Println(i)
                if i == 5 {
                        return //结束当前的函数
                }
        }
        fmt.Println("hello golang")
}
相关推荐
明月看潮生3 小时前
青少年编程与数学 02-003 Go语言网络编程 10课题、HTTP/HTTPS协议
网络·青少年编程·golang·编程与数学
小邓的技术笔记4 小时前
20241106,LeetCode 每日一题,用 Go 实现整数回文数判断
算法·leetcode·golang
小猪快点跑5 小时前
go sync.Cond 条件变量
golang·条件变量·cond
景天科技苑6 小时前
【云原生开发】如何通过client-go来操作K8S集群
云原生·golang·kubernetes·client-go·k8s二次开发
凡人的AI工具箱15 小时前
15分钟学 Go 第 37 天:综合复习与小项目
开发语言·后端·算法·golang
cookies_s_s2 天前
Golang--函数、包、defer、系统函数、内置函数
开发语言·后端·golang
为什么这亚子2 天前
七、k8s快速入门之资源控制器
服务器·云原生·容器·golang·kubernetes
懒阳羊2 天前
GO语言基础(三)
开发语言·数据结构·golang
凡人的AI工具箱2 天前
15分钟学 Go 第 35 天:Go的性能调优 (7000字详细教程)
开发语言·后端·算法·golang
codkingo2 天前
Go-单元测试
服务器·golang·单元测试