当前位置: 首页 > news >正文

go学习之流程控制语句

文章目录

    • 流程控制语句
      • 1.顺序控制
      • 2.分支控制
        • 2.1单分支
        • 2.2双分支
        • 单分支和双分支的四个题目
        • switch分支结构
      • 3.循环控制
        • for循环控制
        • while 和do...while的实现
      • 4.跳转控制语句
        • break
        • continue
        • goto
        • return
        • goto
        • return

流程控制语句

介绍:在程序中,程序运行的流程控制决定程序如何执行的,是我们应该掌握的,主要有三大流程控制语句

1.顺序控制

介绍:程序从上到下逐行地执行,中间没有任何判断效果

一个案例说明,必须下面的代码,没有判断,也没有跳转。因此程序按照默认的流程执行。即顺序控制

var days int  = 97
var week int =days / 7
var day int = days % 7
fmt.Println("%d个星期零%d天",week,day)

流程图

在这里插入图片描述

顺序控制举例和注意事项

Golang中定义变量时采用合法额前向引用。如

func main(){
var num1 int = 0
var num2 int = num1 + 20
fmt.Println(num2)
}
错误形式:不可以先使用后声明
func main(){
var num2 int = num1 + 20 //错误,一定要注意先后顺序
var num1 int = 10
fmt,Println(num2)
}

2.分支控制

分支控制if-else介绍

让程序有选择的执行,分支控制有三种。

2.1单分支

基本语法

if 条件表达式{执行代码块
}
说明:当条件表达式为true时,就会执行{}的代码。
注意:{}是必须有的,就算你只写一行代码

应用案例

package mainimport ("fmt"
)
//编写一个程序可以输入一个人的年龄,
// 如果同志的年龄大于18岁则输出你的年龄大于18岁
//要对自己的行为负责//分析:年龄 ==》var age int
//2.从控制台接收输入func main(){
var age int
fmt.Println("请输入你的年龄:")
fmt.Scanln(&age)
if age >=18 {fmt.Println("你的年龄大于18岁,要为自己的行为所负责!")}
}

单分支细节说明

Go的if还有一个强大的地方就是条件判断语句里允许声明一个变量,这个变量的作用域只能在该条件逻辑块内,其他地方就不起作用了

//golang支持在if中,直接定义一个变量,比如下面的
if age := 20; age > 18{fmt.Println("你的年龄大于18岁,要为自己的行为所负责!")
}

2.2双分支

基本语法

if 条件表达式{执行代码块1
}else{执行代码块2
}
说明:当条件表达式成立,即执行代码块1,否则执行代码块2{}也是必须有的
func main(){
var age int
fmt.Println("请输入你的年龄:")
fmt.Scanln(&age)
if age >=18 {fmt.Println("你的年龄大于18岁,要为自己的行为所负责!")}else{//强制编程语法。else一定在这个地方fmt.Println("你的年龄不大,这次放过你了")}}

双分支细节

双分支只会执行其中的一个分支。

package mainimport ("fmt"
)
func main(){var x int = 1var y int = 1if(x>2){//golang中可以写小括号,但是官方不推荐就是if(y>2){fmt.Println(x+y)}fmt.Println("hello")}else{fmt.Println("x is =",x) //输出x=1}
}
var x int = 4
if > 2  //编译都不会通过,因为没有大括号fmt.Println("ok")
elsefmt.Println("helo")
//没有大括号就是错的。编译错误没有什么输出判断下列代码是否正确
var x int = 4
if x >2{fmt.Println("ok")
}//也是错的因为else要在这个括号的后面
else{fmt.Println("hello")
}
//编译错误,原因是else不能换行输出

单分支和双分支的四个题目

1)编写程序,声明2 个 int32型变量并赋值。判断两个数之和。如果大于等于50,打印“hello world"

var a int32 =45var b int32 =78if a+b>=50 {fmt.Println("这个数的和大于50")}

2)编写程序,声明2个float64型变量并赋值,判断第一个数大于10.0且第二个数小于20.0打印这两个数之和

 //第二题var c float64 =11.0var d float64 =17.0if c > 10.0 && d < 20.0 {fmt.Println("和=",(c+d)) //和=28}

3)定义两个变量int32 判断二者之和,是否能被3又被5整除,打印提示信息

//第三题var num1 int32 = 3var num2 int32 = 12if (num1 + num2) % 3 ==0 && (num1 + num2) % 5 == 0 {fmt.Println("能被三整除又可以被5整除")}

4)判断一个年份是否为闰年 ,闰年的条件时符合二者条件之一:(1)年份能被4整除但不能被100整除;(2)能被400整除

//第四题求润年fmt.Println("请输入相应的年份:")fmt.Scanf("%d",&year)if (year% 4==0 && year % 100 !=0) || year % 400 ==0{fmt.Printf("%d是润年",year)}else{fmt.Printf("%d不是润年",year)}

2.3多分支

基本语法:

if 条件表达式1{
执行代码块1
}else if 条件表达式2 {执行代码块2
}
...
else{执行代码块n
}

对上面基本语法的说明

1)多分支的判断流程如下

(1)先判断条件表达式1是否成立,如果为真,就执行代码块1

(2)如果条件表达式1为假就继续判断条件表达式2是否成立,如果条件表达式2为真就执行代码块2,

(3)以此类推

(4)如果所有条件表达式不成立,则执行else的语句块。

2)else不是必须的

3)多分支最终只能有一个执行入口

流程图(更加清晰的说清楚):

在这里插入图片描述

func main(){//多分支类型的理解/*岳小鹏参加golang考试,他和父亲岳不群达成承诺如果成绩100分奖励一台bmw成绩为(80,90)奖励一套iphone14当成绩(60,80)奖励一台ipad其他时,什么奖励都没有请从键盘输入岳小鹏的期末成绩,并加以判断*/var score intfmt.Println("请输入岳小鹏的成绩:")fmt.Scanf("%d",&score)if score==100{fmt.Println("奖励一台BMW")}else if score>80&&score<=99{fmt.Println("奖励一台iphone14")}else if score>=60&&score<=80{fmt.Println("奖励一个ipad")}else{fmt.Println("对不起,他什么都没有好好学习")}
}

分支控制if-else案例介绍

在这里插入图片描述

var b bool = trueif b= false{ //在这里不能赋值,只能写成==fmt.Println("a")}else if b {fmt.Println("b")}else if !b {fmt.Println("c")}else {fmt.Println("d")}

在这里插入图片描述

package mainimport ("fmt""math"
)
func main(){//分析思路//1.a,b,c是三个float64//2.使用到给出的书序公式//3.使用到多分支//4.使用到math.squr方法//走代码var a float64 =3.0var b float64 =1.0var c float64 =10.0m := b*b -4 * a * c//多分支判断if m>0 {x1 :=-b + math.Sqrt(m) / 2 * ax2 :=-b - math.Sqrt(m) / 2 * afmt.Printf("x1=%v,x2=%v",x1,x2)}else if m == 0 {x1 := (-b + math.Sqrt(m)) / 2 *afmt.Printf("x1=%v",x1)}else{fmt.Println("无解...")}

在这里插入图片描述

//分析思路//设计三个变量,需要从控制台输入var height int32var money float32var handsome boolfmt.Println("请你输入身高(厘米)")fmt.Scanln(&height)fmt.Println("请你输入财富")fmt.Scanln(&money)fmt.Println("帅吗")fmt.Scanln(&handsome)if height>180 && money>10000000.0 && handsome==true{fmt.Println("我一定要嫁给他")}else if height>180 || money>10000000.0 || handsome==true{fmt.Println("嫁吧,比上不足,比下有余")}else{fmt.Println("不嫁")}

嵌套分支

基本介绍:

在一个分支结构中又完整嵌套了另一个完整的分支结构,里面的分支结构称为内层分支外面的称为外层分支

基本语法

if条件表达式{if条件表达式{}else{}
}

注意:嵌套分支不宜过多,建议控制在3层内

应用案例1:

参加白米运动会,如果用时8秒以内进入决赛,否则提示淘汰。并且根据特别提示进入男子组或女子组,输入成绩和性别,进行判断

float64 second | string gender

var   second float64fmt.Println("请输入你的比赛成绩")fmt.Scanln(&second)//先判断是否进入决赛if second <=8{//进入决赛了var  gender stringfmt.Println("请问您的性别是")fmt.Scanln(&gender)if gender == "男"{fmt.Println("恭喜你进入男子组决赛")}else{fmt.Println("恭喜你进入女子组决赛")}}else{fmt.Println("对不起你被淘汰了")}
//案例2:出票系统
func main(){/*出票系统:根据淡旺季的月份和年龄。打印票价 【考虑学生先做】4~10旺季“成人(18-60):60儿童(<18):半价老人(>60):1/3淡季:成人:40其他:20 //分析思路1.month age两个变量 byte2.使用嵌套分支*/var month bytevar age bytevar price float64 =60.0fmt.Println("请输入您旅游的月份")fmt.Scanln(&month)fmt.Println("请输入您旅游的年龄")fmt.Scanln(&age)if month>=4 && month<=10{if age > 60{fmt.Printf("票价是%v",price / 3)}else if age >=18{fmt.Printf("票价是%v",price)}else{fmt.Printf("票价: %v",price / 2)}}else{if age >=18 && age <60{fmt.Println("票价是",40)}else{fmt.Println("票价是",20)}}

switch分支结构

1)switch语句用于基于不同条件执行不同动作,。每一个case分支都是唯一的,从上到下逐一测试,直到匹配为止

2)匹配项后面也不需要再加break

基本语法

switch 表达式{
case 表达式1,表达式2,...:语句块1
case 表达式3,表达式4,...:语句块2
...
default:语句块
}

switch流程图

在这里插入图片描述

对上图的说明和总结

1)switch的执行的流程是,先执行表达式,得到值,然后和case表达式进行比较,如果相等,就匹配到,然后执行对应的case语句块,然后退出switch的控制

2)如果switch的表达式的值没有和任何表达式的值匹配成功,执行后退出switch机制

3)golang的表达式可以有多个,并且使用逗号间隔

4)golang中的case语句块不需要写break,因为默认就会有break.当程序执行完语句块之后,就直接退出该switch控制结构

案例:

请编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f a表示星期一, b表示星期二…根据用户输入显示相应的信息,要求使用switch语句完成

func main(){/*请编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f a表示星期一,b表示星期二...根据用户输入显示相应的信息,要求使用switch语句完成分析:1,定义一个变量接受字符2.使用switch完成*/var key bytefmt.Println("请输入一个字符  a b c d e f g")fmt.Scanf("%c",&key)switch key {case 'a':fmt.Println("周一")case 'b':fmt.Println("周二")case 'c':fmt.Println("周三")case 'd':fmt.Println("周四")case 'e':fmt.Println("周五")case 'f':fmt.Println("周六")case 'g':fmt.Println("周日")	default:fmt.Println("输入有误")						}

​ 关于switch的细节讨论

1)case后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)

//写一个非常简单的函数
func test(b byte) byte {return b+1}
func main(){	var key bytefmt.Println("请输入一个字符  a b c d e f g")fmt.Scanf("%c",&key)switch test(key) { //调用、test函数

2)case后的各个表达式的值的数据类型,必须和switch的表达式数据类型一致

var n1 int32 = 20var n2 int32 = 20 //改为int64是错误的switch n1{//n2的类型需要与n1保持一致case n2 :fmt.Println("ok") //输出了okdefault:fmt.Println("输入有误")			}

3)case后面可以带多个表达式,使用逗号间隔。比如case表达式1,表达式2

var n1 int32 = 5var n2 int32 = 20 //改为int64是错误的switch n1{//n2的类型需要与n1保持一致case n2,10,5 : //case后面可以有多个表达值。匹配其中的一个就可以fmt.Println("ok") //输出了okdefault:fmt.Println("输入有误")			}

4)case后面的表达式如果是常量值(字面量)则要求不能重复

var n1 int32 = 20var n2 int32 = 20 //改为int64是错误的var n3 int32 =5switch n1{//n2的类型需要与n1保持一致case n2,10,5 : //case后面可以有多个表达值。匹配其中的一个就可以fmt.Println("ok") //输出了okcase 5://错误上面已经有一个匹配值了,我们不可以重复casefmt.Print("5")case n3: //这种情况是可以正常进行编译操作的的可以说是骗过了编译器fmt.Println("n3")default:fmt.Println("输入有误")			}

5)case后面不需要带break程序匹配到一个case后就会执行对应的代码块,然后退出switch,如果一个斗匹配不到则执行default

6)default语句不是必须的

我们不写default也可以

7)switch后也可以不带表达式,类似于if-else分支来使用

//switch后可以不带表达式,类似于if -else 分支来使用var age int = 10switch {case age ==10 :fmt.Println("age ==10")case age ==20 :fmt.Println("age ==20")case age ==30 :fmt.Println("age ==30")default :fmt.Println("没有匹配到")				}
//case中也可以就age的范围进行判断var score int = 90switch {case score > 90 :fmt.Println("成绩优秀")case score >=70 && score <=90 :fmt.Println("成绩优良")case score >=60 && score <70 :fmt.Println("成绩及格")default :fmt.Println("不及格")		}

8)switch后也可以直接声明/定义一个变量,分号结束,不推荐

//switch后也可以直接声明/定义一个变量,分号结束,并不推荐switch grade :=90; {case grade > 90 :fmt.Println("成绩优秀")case grade >=70 && grade <=90 :fmt.Println("成绩优良")case grade >=60 && grade <70 :fmt.Println("成绩及格")default :fmt.Println("不及格")		}

9)switch穿透-fallthough,如果在case语句块后增加fallthrough,则会继续执行下一个case也叫switch穿透

	//switch的穿透 fallthroughtvar num int = 10switch num{case 10 :fmt.Println("ok1")fallthrough  //默认只能穿透一层case 30 :fmt.Println("ok2")case 20 :fmt.Println("ok3")		default :fmt.Println("没有匹配到")				}

10)Type Switch :switch语句还可以被用于 typ-switch来判断某个interface变量中实际指向的变量类型 xtype()类似于多态操作

在这里插入图片描述

	var x interface{}var y = 10.0x = y switch i:= x.(type){case nil:fmt.Printf("x的类型是:%T",i)case int:fmt.Println("x是int型")case float64:fmt.Println("x是float64型")//会输出	  case func(int) float64:fmt.Println("x是func(int)型")case bool,string:fmt.Println("x是bool型或者string型")		 		default:fmt.Println("未知")}

案例:

1).使用switch把小写类型的char型转为大写(键盘输入)。只转换a,b,c,d,e,其他的输出“Other”

func main() {//1,使用switch将小写字符改为大写字母var char bytefmt.Println("请输入相应的字符")fmt.Scanf("%c",&char)switch char{case 'a':fmt.Println("A")case 'b':fmt.Println("B")case 'c':fmt.Println("C")case 'd':fmt.Println("D")case 'e':fmt.Println("E")default :fmt.Println("other")						}

2)对学生成绩大于60分的,输出”合格"。低于60的输出“不合格”。(注:输入的成绩不能大于100)

 var score float64fmt.Println("请输入成绩")fmt.Scanln(&score)switch int(score / 60){case 1:fmt.Println("及格")	case 0:fmt.Println("不及格")	default:fmt.Println("输入有误...")

3)根据用户指定月份,打印该月份所属的季节。3,4,5.春季 6,7,8夏季 9,10,11秋季 12,1,冬季

//3,根据用户指定月份,打印该月份所属的季节。// 3,4,5.春季 6,7,8夏季 9,10,11秋季 12,1,// 冬季var month bytefmt.Println("请输入月份")fmt.Scanln(&month)switch month {case 3,4,5:fmt.Println("春季")case 6,7,8:fmt.Println("夏季")	case 9,10,11:fmt.Println("秋季")	case 12,1,2:fmt.Println("冬季")	default:fmt.Println("您输错了月份")	}

switch和if的比较

1)如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型。建议使用switch语句简洁高效

2)其他情况:对区间判断和结果为bool类型的判断,用if if的使用范围更广

3.循环控制

for循环控制

基本语法

for循环变量初始化;循环条件;循环变量迭代{循环操作(语句)
}

对上面的语法格式说明

1)对for循环来说,有四个要素

2)循环变量初始化

3)循环条件

4)循环操作(语句),有人也叫循环体。

5)循环变量的迭代

6)for循环执行的顺序

for循环执行的顺序说明

1)执行循环变量的初始化,比如 i :=1

2)执行循环条件,比如 i<=n

3)如果循环条件为真就执行循环操作

4)执行循环变量迭代

5)反复执行 2 3 4 步骤,直到循环条件为false就退出for循环

案例

编写一个程序循环十次"你好刘承传"

package mainimport ("fmt"
)
func main(){for i :=1;i<= 10;i++{fmt.Println("你好刘承传",i)}
}

在这里插入图片描述

for循环的注意事项和细节说明

1)循环条件时返回一个布尔值的表达式

2)for循环的第二种使用方式

for 循环判断条件 {//循环执行语句
}
将变量初始化和变量迭代写到其他的位置
案例:
//for循环的第二种写法j := 1 //循环变量初始化for j <= 10 { //循环条件fmt.Println("你好刘承传",j) //循环体j++  //循环变量的迭代}

3)for循环的第三种使用方法

for {//循环执行语句
}
上面的写法等价for ; ; {}是一个无限循环,通常需要配合break语句使用
//for循环的第三种写法,这种写法通常会配合break进行使用k :=1for { //此处等价 for ; ; ;{}if k <= 10{fmt.Print("helllo\n")}else{ //k>10时就break跳出break //break就是跳出整个for循环}k++}

for的注意事项和细节说明

4)Golang提供for-range的方式,可以方便遍历字符串和数组(注:数组的遍历)

way1传统方式进行遍历	
str := "hello world!"
for i :=0;i<len(str);i++{
fmt.Printf("i=%d val=%c\n",i,str[i])
}way2for-range方式进行遍历
func main(){
str :="hello,world!北京"
for index,val :=range str {
fmt.Printf("index=%d val=%c\n",index,val)
}注意:for-range在遍历字符串时,是按照字符来遍历的,而不是按照字节来的,请注意这点
}

上面的细节讨论:

如果我们的字符串含有中文,那么传统的遍历字符串方式,就是错误。会出现乱码,原因是对字符串的遍历是按照字节进行遍历的,而一个汉字在utf8编码对应的是3个字节

如何解决,需要将str []str切片

//传统方式对字符串进行切片str2 := []rune(str) //把str转成了[]runefor i :=0;i<len(str2);i++{fmt.Printf("i=%d val=%c\n",i,str2[i])}

对应for-range遍历字符串时,是按照字符串来遍历的,而不是按照字节来的。请注意这一点

for循环练习题

1)打印1~100之间所有是9的倍数的整数的个数及总和

func main(){var ge int = 0var sum int = 0for i :=1;i<=100;i++{if i % 9 ==0{ge++sum = sum + i}}fmt.Printf("1~100之间是9的倍数额整数个数为%d,总和为%d",ge,sum)
}

2)完成下面的表达式输出

//第二题var n int =6for i :=0;i<=n;i++{fmt.Printf("%v + %v= %v\n",i,n-i,n)}

while 和do…while的实现

Go语言没有while和do …while语法,我们可以使用for循环来实现其使用效果

1)for循环实现while效果:先进行判断条件是否符合在进行循环输出

循环变量初始化
for {if 循环条件表达式{break  //跳出for循环}循环操作(语句)循环变量迭代
}
说明:
  1. for循环是一个无限循环
  2. break语句就是跳出循环

使用上面的while循环输出十句“hello world”

//使用while方式输出十句"hello world"//循环变量初始化var i int = 1for {if i>10 {break  //跳出循环结束过程}fmt.Println("hello world",i)i++  //循环变量的迭代}

使用do…while实现:先进行循环当条件不符合时就跳出循环

语法

循环变量初始化
for {循环操作(语句)循环变量迭代if 循环条件表达式{break //跳出for循环}
}

对上图的说明

  1. 上面的循环是先执行,再判断,因此至少执行一次
  2. 当循环条件成立后,就会执行break,break就是跳出for循环,结束for循环

案例演示使用上面的dowhile实现输出十句helloworld

//使用do while的形式进行实现
var i int  = 1for {fmt.Println("hello world" ,i)i++ //循环变量进行迭代if i>10{break //跳出for循环}}

多重循环的控制

介绍:

1)将一个循环放在另一个循环体内,就形成了嵌套循环,在外边的for称为外层循环在里面的for循环称为内层循环(建议一般使用两层,最多不得超过三层)

2)实质上,嵌套循环就是把内层循环当作外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层循环的当次循环,开始下一次循环

3)设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n=nm次

应用实例

1》统计3个班级成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分(学生成绩从键盘输入)

//案例1/*1)统计3个班的成绩情况,每个班5名同学,求出各个班的平均分和所有班级的平均分(学生的成绩从键盘输入)分析实现思路1.统计一个班成绩情况,每个班有5名同学,求出这个班的平均分2.学生数就5个 3.声明一个变量sum统计班级的总分4.定义一个变量统计总成绩得出所有学生的平均分分析思路2要统计三个班,走三次分析思路31,将代码激活2.定义两个变量表示班级的个数和班级的人数代码实现*/var classNum int =2var stuNum int = 5var totalSum float64 = 0.0for j :=1;j <=classNum;j++{sum := 0.0for i := 1;i<=stuNum;i++{var score float64fmt.Printf("请输入第%d个班的第%d个学生成绩\n",j,i)fmt.Scanln(&score)//累计总分sum += score}fmt.Printf("第%d个班级的平均分是%v\n",j,sum / float64(stuNum))//将总分进行累加totalSum += sumfmt.Println("  ")}fmt.Printf("各个班级的总成绩是%v各个班级的平均分是%v",totalSum,totalSum/ float64(classNum * stuNum))
}

2》统计三个班及格人数,每个班有5名同学

func main(){//案例1/*1)统计3个班的成绩情况,每个班5名同学,求出各个班的平均分和所有班级的平均分(学生的成绩从键盘输入)分析实现思路1.统计一个班成绩情况,每个班有5名同学,求出这个班的平均分2.学生数就5个 3.声明一个变量sum统计班级的总分4.定义一个变量统计总成绩得出所有学生的平均分分析思路2要统计三个班,走三次分析思路31,将代码激活2.定义两个变量表示班级的个数和班级的人数//分析思路3统计班级及格人数1,声明一个变量用于保存及格人数代码实现*/var passc int = 0var classNum int =2var stuNum int = 5var totalSum float64 = 0.0for j :=1;j <=classNum;j++{sum := 0.0for i := 1;i<=stuNum;i++{var score float64fmt.Printf("请输入第%d个班的第%d个学生成绩\n",j,i)fmt.Scanln(&score)//累计总分sum += score//判断分数是否及格if score >=60{passc ++}}fmt.Printf("第%d个班级的平均分是%v\n",j,sum / float64(stuNum))//将总分进行累加totalSum += sumfmt.Println("  ")}fmt.Printf("各个班级的总成绩是%v各个班级的平均分是%v及格人数是%v",totalSum,totalSum/ float64(classNum * stuNum),passc)
}

打印一个矩形

//矩形
for i := 1;i<=5;i++{for j :=1;j<=5;j++{fmt.Printf("*")}fmt.Println(" ")}//左侧直角三角形for i := 1;i<=5;i++{for j :=1;j<=i;j++{fmt.Printf("*")}fmt.Println(" ")}
//打印金字塔案例2打印金字塔经典案例
案例分析
代码思路
1.打印一个金字塔*/var toleve int =9for i := 1;i<=toleve;i++{//在打印星号前打印空格for k :=1;k<=toleve-i;k++{fmt.Print(" ")}for j :=1;j<=2*i-1;j++{fmt.Printf("*")}fmt.Println(" ")}
}

在这里插入图片描述

打印空心金字塔

//打印空心金字塔/*** *****分析:在我们给每行打印*号时需要考虑一个问题是打印*还是打印空格每层的第一个和最后一个就是打印星星,其他的都打印空格分析到例外情况,最底层是全部打印星星*/var toleve int =9for i := 1;i<=toleve;i++{//在打印星号前打印空格for k :=1;k<=toleve-i;k++{fmt.Print(" ")}//在空格后面打印星星for j :=1;j<=2*i-1;j++{if j ==1 || j==2 * i -1 || i==toleve{fmt.Printf("*")}else{fmt.Print(" ")}}fmt.Println(" ")}

在这里插入图片描述

打印九九乘法表

/*打印九九乘法表*/for i:=1;i<=9;i++{for j:=1;j<=i;j++{fmt.Printf("%v * %v= %v  ",i,j,i*j)}fmt.Println(" ")}
}

4.跳转控制语句

break

看需求:

随机生成1-100的一个数,直到生成了99这个数,看看你一共用了几次

分析:编写一个无限循环的控制,然后不停地随机生成数,当生成了99时,就退出这个无限循环==》break

package mainimport ("fmt""math/rand""time"
)
func main() {//为了生成一个随机数,还需要个rand设置一个种子//time.Now().Unix():返回一个从1970:01:01的0分0秒到现在的秒数//rand.Seed(time.Now().Unix())//如何生成1-100的整数//n := rand.Intn(100) +1 //[0-100]故加一变成那个[1 100]// fmt.Println(n)/*思路:编写一个无限循环控制,然后不停的随机生成数,当生成了99时就退出这个无限循环==>break*/var count int = 0for {rand.Seed(time.Now().UnixNano())n := rand.Intn(100) +1 fmt.Println("n=",n)count ++if(n ==99){break //跳出for循环}}fmt.Printf("生成99一共使用了%v次",count)}

基本介绍:

break语句用于终止某个语句块的执行,用于中断当前for循环或跳出switch语句

基本语法

( ......
break;......
)

注意事项或细节说明

1)break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是那一层语句块

2)标签的基本使用

label1:{...
label2:  {...
label3:    {...break label2;....}}}

案例代码:

//这里演示一下指定标签的形式使用 breaklabel2:for i := 0; i < 4; i++{//label1:  //设置标签for j := 0; j < 10; j++{if j ==2 {//break //break默认会跳出最近的for循环//break label1break label2}fmt.Println("j=",j) //j=0 j=1}}

对案例的说明:

  • break默认跳出最近的for循环
  • break后面可以指定标签,跳出标签对应的for循环

break语句练习题

1)100以内的数求和,求出当和第一次大于20的当前数。

func main(){sum := 0for i :=1;i <=100; i++ {sum +=i //求和if sum > 20 {fmt.Println("当sum大于20时,这个数是:",i)break}}

2)实现登录验证,有三次机会,如果用户名为“张无忌”,密码"888"提示登录成功,否则提示还有几次机会

//实现登录验证,有三次机会,如果用户名为“张无忌密码为888就提示登录成功//否则就提示还有几次机会var name stringvar passwd stringvar loginla int = 3for i:=1;i<=3;i++{fmt.Println("请输入姓名")fmt.Scanln(&name)fmt.Println("请输入密码")fmt.Scanln(&passwd)if name !="张无忌" || passwd != "888"{loginla --fmt.Printf("登录失败,你还有%v次机会\n",loginla)}else{fmt.Println("恭喜你登录成功")break}}

continue

基本介绍:

1)continue语句用于结束本次循环,继续执行下一次循环

2)continue语句出现在多层嵌套循环语句体中时,可以通过标签指明要跳过的是哪一层循环,这个和前面的break标签的使用的规则一样

基本语法

{...continue;...
}

案例分析continue的使用

func main() {/*continue案例这里演示一下指定标签的形式来使用*///label2for i := 0; i<4; i++{//label1:设置一个标签
for j :=0; j<10 ; j++{if j ==2 {continue}fmt.Println("j=",j)}}
}

输出4次134…9,但是每次都没有2在其中。

continue输出1~100的奇数

//1~100的奇数
for i:=1; i<=100; i++{if i%2!=0{fmt.Println(i)}else{continue}
}

从键盘读入个数不确定的整数,并判断读入额正数和负数额个数,输入为0时结束程序for循环break continue完成

func main() {var posicount intvar negacount intvar num intfor {fmt.Println("请输入一个整数")fmt.Scanln(&num)if num ==0 {break //终止for循环}if num >0 {posicount ++continue //结束本次循环,进入下一次循环}negacount ++}fmt.Printf("正数的个数是%v,负数的个数是%v",posicount,negacount)

goto

介绍:

1)Go语言的goto语句可以无条件地转移到程序中指定的行

2)goto语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能

3)在Go程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解与调试程序都产生困难

基本语法

goto label
...
label:statement
func main(){//演示goto的使用fmt.Println("ok1")goto lable1fmt.Println("ok2")fmt.Println("ok3")fmt.Println("ok4")lable1:fmt.Println("ok5")fmt.Println("ok6")fmt.Println("ok7")
}
//运行结果为:
ok1
ok5
ok6
ok7

return

return使用在方法,表示跳出所在的函数或方法

func main(){
for i :=1; i<=10; i++{
if i ==3{
return
}
fmt.Println(i)
}
fmt.Println("helloworld")
}

说明:

1)如果return 是在普通的函数,则表示跳出这个函数,即不再执行这个函数

}


案例分析continue的使用```go
func main() {/*continue案例这里演示一下指定标签的形式来使用*///label2for i := 0; i<4; i++{//label1:设置一个标签
for j :=0; j<10 ; j++{if j ==2 {continue}fmt.Println("j=",j)}}
}

输出4次134…9,但是每次都没有2在其中。

continue输出1~100的奇数

//1~100的奇数
for i:=1; i<=100; i++{if i%2!=0{fmt.Println(i)}else{continue}
}

从键盘读入个数不确定的整数,并判断读入额正数和负数额个数,输入为0时结束程序for循环break continue完成

func main() {var posicount intvar negacount intvar num intfor {fmt.Println("请输入一个整数")fmt.Scanln(&num)if num ==0 {break //终止for循环}if num >0 {posicount ++continue //结束本次循环,进入下一次循环}negacount ++}fmt.Printf("正数的个数是%v,负数的个数是%v",posicount,negacount)

goto

介绍:

1)Go语言的goto语句可以无条件地转移到程序中指定的行

2)goto语句通常与条件语句配合使用。可用来实现条件转移,跳出循环体等功能

3)在Go程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解与调试程序都产生困难

基本语法

goto label
...
label:statement
func main(){//演示goto的使用fmt.Println("ok1")goto lable1fmt.Println("ok2")fmt.Println("ok3")fmt.Println("ok4")lable1:fmt.Println("ok5")fmt.Println("ok6")fmt.Println("ok7")
}
//运行结果为:
ok1
ok5
ok6
ok7

return

return使用在方法,表示跳出所在的函数或方法

func main(){
for i :=1; i<=10; i++{
if i ==3{
return
}
fmt.Println(i)
}
fmt.Println("helloworld")
}

说明:

1)如果return 是在普通的函数,则表示跳出这个函数,即不再执行这个函数

2)如果return在main函数,表示终止main函数,也就是说终止程序

相关文章:

go学习之流程控制语句

文章目录 流程控制语句1.顺序控制2.分支控制2.1单分支2.2双分支单分支和双分支的四个题目switch分支结构 3.循环控制for循环控制while 和do...while的实现 4.跳转控制语句breakcontinuegotoreturngotoreturn 流程控制语句 介绍&#xff1a;在程序中&#xff0c;程序运行的流程…...

docker基于已有容器和通过Dockerfile进行制作镜像配置介绍

目录 一.制作镜像的两种方式 1.在已有容器中更新并提交这个镜像 2.使用Dockerfile来制作 二.基于容器制作镜像 1.格式 &#xff08;1&#xff09;主要格式 &#xff08;2&#xff09;可选参数 2.案例 基于容器创建镜像设置标签并进行验证是否可用 &#xff08;1&…...

2022年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;最长上升子序列 一个数的序列bi&#xff0c;当b1 < b2 < … < bS的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN)&#xff0c;我们可以得到一些上升的子序列(ai1, ai2, …, aiK)&#xff0c;这里1 < i1 < i2 &…...

二级MySQL(九)——表格数据处理练习

在Mysql中&#xff0c;可以用INSERT或【REPLACE】语句&#xff0c;向数据库中已一个已有的表中插入一行或多行记录。 在Mysql中&#xff0c;可以用【DELETE】或【TRUNCATE】语句删除表中的所有记录。 在Mysql中&#xff0c;可以用【UPDATE】语句来修改数据表中的记录。 为了完…...

QT ListQvector at赋值出错以及解决办法 QT基础入门【QT存储结构】

1、问题 error: passing const QString as this argument discards qualifiers error: assignment of read-only location vec.QVector<int>::at(0) 在Qt中QList,Qvector一般获取元素都是通过at(index)来获取,但是at()的返回是一个const & 常引用,也就是元素不支…...

STM32 CubeMX (H750)RGB屏幕 LTDC

STM32 CubeMX STM32 RGB888 LTDC STM32 CubeMX一、STM32 CubeMX 设置时钟树LTDC使能设置屏幕参数修改RGB888的GPIO 二、代码部分效果 RGB屏幕线束定义&#xff1a; 一、STM32 CubeMX 设置 时钟树 这里设置的时钟&#xff0c;关于刷新速度 举例子&#xff1a;LCD_CLK24MHz 时…...

Redis问题集合(三)在Redis容器里设置键值对

前言 前提是已经拉取了Redis镜像并创建了对应的容器做个记录&#xff0c;方便后续查看 步骤 查看Redis容器的ID&#xff1a;docker ps -a 进入容器&#xff1a;docker exec -it 容器ID /bin/bash进入redis命令行&#xff1a;redis-cli输入密码&#xff1a;auth 配置密码 查看…...

spark中排查Premature EOF: no length prefix available

报错信息 /07/22 10:20:28 WARN DFSClient: Error Recovery for block BP-888461729-172.16.34.148-1397820377004:blk_15089246483_16183344527 in pipeline 172.16.34.64:50010, 172.16.34.223:50010: bad datanode 172.16.34.64:50010 [DataStreamer for file /bdp/data/u9…...

numpy高级函数之where和extract函数

1 numpy.where() 函数返回输入数组中满足给定条件的元素的索引 ---------------------------------------------------- 代码&#xff1a; n1np.random.randint(10,20,10) n2np.where(n1>15) 结果&#xff1a; [17 15 19 15 12 10 16 11 15 13] #原始数组 (array([…...

用Python写一个武侠游戏

前言 在本教程中&#xff0c;我们将使用Python写一个武侠类的游戏&#xff0c;大的框架全部搭好了&#xff0c;很多元素都可以自己添加&#xff0c;让游戏更丰富 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列&#xff1a; ☄️爬虫JS逆向系列专栏 -…...

Java --- 异常处理

目录 一、什么是异常 二、异常抛出机制 三、如何对待异常 四、 Java异常体系 4.1、Throwable 4.2、Error 4.2、Exception 4.2.1、编译时异常 4.2.2、运行时期异常 五、异常处理 5.1、捕获异常&#xff08;try-catch&#xff09; 5.1.2、catch中异常处理方式 …...

CDN/DCDN(全站加速)排查过程中如何获取Eagle ID/UUID

目录 前言1.通过浏览器直接访问文件时获取Request ID 前言 阿里云CDN/DCDN(全站加速)为接收到的每个请求分配唯一的服务器请求ID&#xff0c;作为关联各类日志信息的标识符。当您在使用CDN/DCDN(全站加速)过程中遇到错误且希望阿里云技术支持提供协助时&#xff0c;需要提交失…...

网络安全应急响应预案培训与演练目的

1、增强网络安全意识 网络安全事故隐患往往“生成”于无形。例如&#xff0c;漏洞或黑客攻 击发生之时&#xff0c;受害方企事业单位可能处于非常危险的境地而无所察 觉&#xff0c;一些内部部门人员的网络安全意识也容易懈怠。但不论是内部 员工的疏忽还是管理上的大意&am…...

2023年高教社杯 国赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…...

7.Oracle视图创建与使用

1、视图的创建与使用 在所有进行的SQL语句之中&#xff0c;查询是最复杂的操作&#xff0c;而且查询还和具体的开发要求有关&#xff0c;那么在开发过程之中&#xff0c;程序员完成的并不是是和数据库的所有内容&#xff0c;而更多的是应该考虑到程序的设计结构。可以没有一个项…...

rust学习-不安全操作

在 Rust 中,不安全代码块用于避开编译器的保护策略 四种不安全操作 解引用裸指针通过 FFI (Foreign Function Interface,外部语言函数接口)调用函数调用不安全的函数内联汇编(inline assembly)解引用裸指针 原始指针(raw pointer,裸指针)* 和引用 &T 有类似的功…...

RHCE——八、DNS域名解析服务器

RHCE 一、概述1、产生原因2、作用3、连接方式4、因特网的域名结构4.1 拓扑4.2 分类4.3 域名服务器类型划分 二、DNS域名解析过程1、分类2、解析图&#xff1a;2.1 图&#xff1a;2.2 过程分析 三、搭建DNS域名解析服务器1、概述2、安装软件3、/bind服务中三个关键文件4、配置文…...

flink cdc初始全量速度很慢原因和优化点

link cdc初始全量速度很慢的原因之一是&#xff0c;它需要先读取所有的数据&#xff0c;然后再写入到目标端&#xff0c;这样可以保证数据的一致性和顺序。但是这样也会导致数据的延迟和资源的浪费。flink cdc初始全量速度很慢的原因之二是&#xff0c;它使用了Debezium作为捕获…...

论文笔记: MOGRIFIER LSTM

2020 ICLR 修改传统LSTM 当前输入和隐藏状态充分交互&#xff0c;从而获得更佳的上下文相关表达 1 Mogrifier LSTM LSTM的输入X和隐藏状态H是完全独立的 机器学习笔记&#xff1a;GRU_gruc_UQI-LIUWJ的博客-CSDN博客这篇论文想探索&#xff0c;如果在输入LSTM之前&#xf…...

Angular中使用drag and drop实现文件拖拽上传,及flask后端接收

效果&#xff1a;拖拽文件到组件上面时 边框变大变红 松手后发送到服务器(或者点击蓝字手动选择文件)并且把文件名显示在框内&#xff0c;美化还没做 html <div class"drapBox"><div id"drop" (dragenter)"dragenter($event)" (dragov…...

Spring Authorization Server入门 (十六) Spring Cloud Gateway对接认证服务

前言 之前虽然单独讲过Security Client和Resource Server的对接&#xff0c;但是都是基于Spring webmvc的&#xff0c;Gateway这种非阻塞式的网关是基于webflux的&#xff0c;对于集成Security相关内容略有不同&#xff0c;且涉及到代理其它微服务&#xff0c;所以会稍微比较麻…...

配置Flink

配置flink_1.17.0 1.Flink集群搭建1.1解压安装包1.2修改集群配置1.3分发安装目录1.4启动集群、访问Web UI 2.Standalone运行模式3.YARN运行模式4.K8S运行模式 1.Flink集群搭建 1.1解压安装包 链接: 下载Flink安装包 解压文件 [gpbhadoop102 software]$ tar -zxvf flink-1.1…...

39、springboot的前端静态资源的WebJar支持(bootstrap、jquery等)及自定义图标和首页

★ WebJar支持 Spring Boot支持加载WebJar包中的静态资源&#xff08;图片、JS、CSS&#xff09;&#xff0c; WebJar包中的静态资源都会映射到/webjars/**路径。——这种方式下&#xff0c;完全不需要将静态资源复制到应用的静态资源目录下。只要添加webjar即可。假如在应用的…...

【图论】缩点的综合应用(一)

一.缩点的概念 缩点&#xff0c;也称为点缩法&#xff08;Vertex Contraction&#xff09;&#xff0c;是图论中的一种操作&#xff0c;通常用于缩小图的规模&#xff0c;同时保持了图的某些性质。这个操作的目标是将图中的一些节点合并为一个超级节点&#xff0c;同时调整相关…...

C++—纯虚函数

一、前言 定义一个函数为虚函数&#xff0c;不代表函数为不被实现的函数。 定义函数为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数&#xff0c;才代表函数没有被实现。 定义纯虚函数是为了实现一个接口&#xff0c;起到一个规范的作用&…...

经过卷积神经网络之后的图片的尺寸如何计算

经过卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;处理后&#xff0c;图片的尺寸会发生变化&#xff0c;这是由于卷积层、池化层等操作引起的。计算图片经过卷积神经网络后的尺寸变化通常需要考虑卷积核大小、步幅&#xff08;stride&…...

Java升级JDK17(更高版本同理),修改maven

记住三个网址就行&#xff1a;下面这个是oracle的 Java Platform, Standard Edition 17 ReferenceImplementations https://www.oracle.com/java/technologies/downloads/#jdk17-windows 另外一个 redhat旗下的&#xff1a;这个是开源的&#xff08;推荐这个&#xff01;&am…...

Go测试之.golden 文件

Go测试中的.golden 文件是干什么用的&#xff1f;请举例说明 在Go语言中&#xff0c;.golden文件通常用于测试中的黄金文件&#xff08;golden files&#xff09;。黄金文件是在测试期间记录预期输出结果的文件。测试用例运行时&#xff0c;黄金文件用于比较实际输出与预期输出…...

回归预测 | MATLAB实现GA-RF遗传算法优化随机森林算法多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GA-RF遗传算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GA-RF遗传算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程…...

springboot整合rabbitmq死信队列

springboot整合rabbitmq死信队列 什么是死信 说道死信&#xff0c;可能大部分观众大姥爷会有懵逼的想法&#xff0c;什么是死信&#xff1f;死信队列&#xff0c;俗称DLX&#xff0c;翻译过来的名称为Dead Letter Exchange 死信交换机。当消息限定时间内未被消费&#xff0c;…...

政府网站建设招标书/最常用的搜索引擎有哪些

近日&#xff0c;国内领先的实体商业数字化运营服务商智慧图携手DataPipeline&#xff0c;基于专业的数据集成与应用基础展开了合作。 未来DataPipeline将通过不断提升自身产品和服务实力&#xff0c;与智慧图一道致力于帮助实体商业实现场内场外、线上线下数字化营运的高效融合…...

网站开发要哪些/宁波关键词优化排名工具

python 测量对象的引用个数 sys getrefcount() 测量一个对象的引用计数的方式 import sysclass T:pass t T() sys.getrefcount(t) #输出结果 2&#xff0c;比实际多一次 tt t sys.getrefcount(t) #输出结果 3 del tt sys.getrefcount(t) #输出结果 2 del t sys.getrefcou…...

贵阳建设网站公司/新疆今日头条新闻

生成0 - 1之间的随机数 select random();生成一个1 - 10000之间的随机整数 ceil&#xff1a;得到不小于参数的最小的整数 SELECT ceil(random()*(10000-1)1) as num;floor&#xff1a;得到不大于参数的最大整数 SELECT floor(random()*(10000-1)1) as num;trunc&#xff1a;截断…...

河南网站备案中心/怎么发外链

前几天在网上看到一个北漂程序员的真实遭遇&#xff1a;“被裁整整一个月了&#xff0c;面试了22家&#xff0c;一个offer都没有拿到”这样的遭遇&#xff0c;确实不得不让人怀疑人生啊……虽说现在确实大环境不太好&#xff0c;被裁员的人也是很多&#xff0c;但是也不至于面试…...

天津b2b网站建设哪家好/个人如何加入百度推广

2019独角兽企业重金招聘Python工程师标准>>> JSP有三个指令 page :设定页面的属性与相关的功能 include &#xff1a;包含另一个文件的代码 taglib &#xff1a;使用标签库定义 的自定义标签 也有下面的几个动作 jsp:include :当页面被请求时&#xff0c;引入…...

wordpress主题首页怎么修改/网站百度关键词seo排名优化

今天谈下在Silverlight中如何进行异常处理&#xff0c;用WCF Ria Service在服务器端记录异常日志&#xff0c;后台用log4net组件处理logging&#xff0c;前台给用户弹出一个友好的框&#xff0c;用户也可以在客户端保存异常log到本地&#xff0c;就这么点内容。废话不说&#x…...