go基础之流程控制(下)

程序流程控制介绍

在程序中,程序流程控制决定程序是如何执行的,是我们必须掌握的主要有三大流程控制语句

1)顺序控制

2)分支控制

3)循环控制

 顺序执行介绍

程序从上到下逐行执行,中间没有任何判断和跳转

image

 分支控制if-else 介绍

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

1)单分支

2)双分支

3)多分支

单分支基本语法

if 条件表达式{

执行代码块

}

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

示例

package main
import (
	"fmt"
)
func main(){
	var age byte
	fmt.Println("请输入年龄")
	fmt.Scanln(&age)
	if age > 18{
		fmt.Println("你年龄太大")
	}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo01\main.go
// 请输入年龄
// 17
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo01\main.go
// 请输入年龄
// 20
// 你年龄太大

  单分支流程图

image

 单分支

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

示例

package main
import (
	"fmt"
)
func main(){
	// var age byte
	// fmt.Println("请输入年龄")
	// fmt.Scanln(&age)
	if age:=20; age > 18{
		fmt.Println("你年龄太大")
	}
}
// 执行结果
// 你年龄太大

  双分支

基础语法

if条件表达式{

代码块1

}else{

代码块2

}

 说明:当条件表达式成立,即执行代码块1,否则执行代码块2.{}也是必须得

示例

package main
import (
	"fmt"
)
func main(){
	var age byte
	fmt.Println("请输入年龄")
	fmt.Scanln(&age)
	if  age > 18{
		fmt.Println("你年龄太大")
	} else {
		fmt.Println("你该上学了")
	}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo02\main.go
// 请输入年龄
// 21
// 你年龄太大
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo02\main.go
// 请输入年龄
// 13
// 你该上学了

  双分支流程图

image

测试题

package main
import (
	"fmt"
)
func main(){
	var t1 int32 = 32
	var t2 int32 = 23
	var t3 int32 
	t3 = t1+t2
	if t3 >= 50{
		fmt.Println("hello world")
	}
	var f1 float32 = 8.5
	var f2 float32 = 12.6
	f3 := f1+f2
	if f3 > 10.0 {
		if f2 < 20 {
			fmt.Println("两数的和",f3)
		}
	}
	var c1 int32 = 65
	var c2 int32 = 25
	c3 := c1+c2
	if c4 := c3%3 ; c4 == 0 {
		if c5:=c3%5; c5 == 0 {
			fmt.Println("成~~~")
		}

	}
	var s int = 2026
	if t := s%400; t==0{
		fmt.Println(s,"是闰年")
	}else{
		fmt.Println(s,"不是闰年")
	}
	

}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo03\main.go
// hello world
// 两数的和 21.1
// 成~~~
// 2026 不是闰年

  示例2

package main
import (
	"fmt"
)
func main(){
	var t1 int32 = 32
	var t2 int32 = 23
	
	if ( t1 + t2 ) >= 50{
		fmt.Println("hello world")
	}
	var f1 float32 = 10.5
	var f2 float32 = 8.6

	if f1 > 10.0 && f2 <20 {
		fmt.Println("和=",(f1+f2))
	}
	var c1 int32 = 65
	var c2 int32 = 25

	if ( c1 + c2 ) % 3 == 0 && (c1 + c2) % 5 == 0{
		fmt.Println((c1+c2),"能被整除")
	}
	var s int = 2026

	if (s %4 ==0 &&s % 100 !=0) || s % 400 == 0 {
		fmt.Println(s,"是闰年")
	} else {
		fmt.Println(s,"不是闰年")
	}
	

}
// 执行结果
// hello world
// 和= 19.1
// 90 能被整除
// 2026 不是闰年

  多分支

基本语法

if条件表达式1{

执行代码块1

}else if 条件表达式{

 执行代码块2

}

...

else{

执行代码块n

}

 对上面

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

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

(3)依次类推

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

2)else 不是必须得

3)多分支最终只能执行一个代码块

image

 

多分支示例

package main
import (
	"fmt"
)
func main(){
	var c int
	fmt.Println("输入成绩")
	fmt.Scanln(&c)
	if c == 100{
		fmt.Println("奖励一辆bwm")
	}else if c > 80 {
		fmt.Println("奖励iPhone17")	
	}else if c >=60 {
		fmt.Println("奖励iPad")
	}else{
		fmt.Println("继续努力吧")
	}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo04\main.go
// 输入成绩
// 100
// 奖励一辆bwm
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo04\main.go
// 输入成绩
// 78
// 奖励iPad
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo04\main.go
// 输入成绩
// 85
// 奖励iPhone17
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo04\main.go
// 输入成绩
// 45
// 继续努力吧

  细节提示:if b = false{// golang if 条件判断不支持赋值;syntax error: cannot use assignment b = false as value

package main
import (
	"fmt"
)
func main(){
	var c int
	fmt.Println("输入成绩")
	fmt.Scanln(&c)
	if c == 100{
		fmt.Println("奖励一辆bwm")
	}else if c > 80 {
		fmt.Println("奖励iPhone17")	
	}else if c >=60 {
		fmt.Println("奖励iPad")
	}else{
		fmt.Println("继续努力吧")
	}
	var b bool
//	if b = false{// golang if 条件判断不支持赋值;syntax error: cannot use assignment b = false as value
	if b == false{
		fmt.Println("a")
	}else if b {
		fmt.Println("b")
	}else if !b {
		fmt.Println("c")
	}else{
		fmt.Println("d")
	}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo04\main.go
// 输入成绩
// 100
// 奖励一辆bwm
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo04\main.go
// 输入成绩
// 78
// 奖励iPad
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo04\main.go
// 输入成绩
// 85
// 奖励iPhone17
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo04\main.go
// 输入成绩
// 45
// 继续努力吧
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo04\main.go
// # command-line-arguments
// src\chapter04\demo04\main.go:19:7: syntax error: cannot use assignment b = false as value
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo04\main.go
// 输入成绩
// 80
// 奖励iPad
// a

  示例

package main
import (
	"fmt"
	"math"
)
func main(){

	var a float64 = 3.0
	var w float64 = 100.0
	var i float64 = 6.0
	m := w * w - 4 * a * i
	if m > 0 {
		x1 := (-w + math.Sqrt(m))/2*a
		x2 := (-w - math.Sqrt(m))/2*a
		fmt.Printf("x1=%v x2=%v\n",x1,x2)
	}else if m == 0{
		x1 := (-w + math.Sqrt(m))/2*a
		fmt.Printf("x1=%v x2=%v\n",x1)
	} else {
		fmt.Println("无解")
	} 
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo05\main.go
// x1=-0.5409755150261972 x2=-299.4590244849738

  示例4

package main
import (
	"fmt"
	//"math"
)
func main(){

	var t int
	var c int 
	var s bool
	fmt.Println("请输入你的身高、财产、是否帅")
	fmt.Scanf("%d %d %t",&t,&c,&s)
	if t > 180 && c > 1000 && s == true {
		fmt.Println("嫁给他")
	}else if t > 180 || c >1000 || s == true{
		fmt.Println("嫁吧,比上不足,比下有余")
	}else{
		fmt.Println("不嫁")
	}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo06\main.go
// 请输入你的身高、财产、是否帅
// 185 1200 true
// 嫁给他
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo06\main.go
// 请输入你的身高、财产、是否帅
// 174 800 true
// 嫁吧,比上不足,比下有余
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo06\main.go
// 请输入你的身高、财产、是否帅
// 165 600 false
// 不嫁

  嵌套分支 

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

基本语法

if 条件表达式{

  if 条件表达式{

    }else{

    }

}

示例1

package main
import (
	"fmt"
	//"math"
)
func main(){
	var s int 
	var x bool
	fmt.Println("请输入成绩")
	fmt.Scanln(&s)
	
	if s < 8 {
		fmt.Println("请输入性别")
		fmt.Scanln(&x)
		if x {
			fmt.Println("男子队进入决赛")
		}else{
			fmt.Println("女子对进入决赛")
		}
		
	}else{
		fmt.Println("很遗憾未进入决赛")
	}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo07\main.go
// 请输入成绩
// 5
// 请输入性别
// true
// 男子队进入决赛
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo07\main.go
// 请输入成绩
// 5
// 请输入性别
// false
// 女子对进入决赛
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo07\main.go
// 请输入成绩
// 9
// 很遗憾未进入决赛

  示例2

package main

import (
	"fmt"
	//"math"
)
func main(){
	var s int 
	var y int 

	fmt.Println("输入当前月份")
	fmt.Scanln(&y)
	if  y >= 1 && y <= 12 {  
		fmt.Println("输入年龄")
		fmt.Scanln(&s)
	   if  y >=4 && y <=10{
			if s >= 18 && s <= 60 {
				fmt.Println("旺季成年人票价60")
			}else if s <18 {
				fmt.Println("旺季儿童票价半价30")
			}else {
				fmt.Println("旺季老年人票价1/3 20")
			}
		} else {
			if s >= 18 && s <= 60 {
				fmt.Println("淡季成年人票价40")
			}else{
				fmt.Println("淡季儿童与老人票价20")
			}
		}
	} else {
		fmt.Println("输入当前月份错误")
	}	 
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo08\main.go
// 输入当前月份
// 14
// 输入当前月份错误
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo08\main.go
// 输入当前月份
// 11
// 输入年龄
// 15
// 淡季儿童与老人票价20
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo08\main.go
// 输入当前月份
// 6
// 输入年龄
// 19
// 旺季成年人票价60
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo08\main.go
// 输入当前月份
// 7
// 输入年龄
// 65
// 旺季老年人票价1/3 20

  switch 分支

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

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

switch 表达式{

case 表达式1,表达式2.....:

语句块

case 表达式3,表达式4,...:

语句块2

//这里可以有多个case

default:

语句块:

}

 

流程图

image

 

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

2)如果switch的表达式的值没有和任何的case的表达式匹配成功,则执行default的语句块,执行后退出switch

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

4)golang中case语句块,不需要写break ,因为默认会有,即当程序执行完case语句块后,默认情况下直接退出switch

示例

package main

import (
	"fmt"
	//"math"
)
func main(){
	var z byte
	fmt.Println("请从:a,b,c,d,e,f,g;选择一个")
	fmt.Scanf("%c",&z)
	//fmt.Scanln(&z);默认会转成整数
	switch z {
	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")
	case 'f':
		fmt.Println("穿衣服f")
	case 'g':
		fmt.Println("穿衣服g")
	default:
		fmt.Println("输入错误")
	}


}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo09\main.go
// 请从:a,b,c,d,e,f,g;选择一个
// a
// 穿衣服a
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo09\main.go
// 请从:a,b,c,d,e,f,g;选择一个
// c
// 穿衣服c
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo09\main.go
// 请从:a,b,c,d,e,f,g;选择一个
// o
// 输入错误

  switch 细节

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

package main

import (
	"fmt"
	//"math"
)
func test (chra byte) byte{
	return chra + 1
}
func main(){
	var z byte
	fmt.Println("请从:a,b,c,d,e,f,g;选择一个")
	fmt.Scanf("%c",&z)
	//fmt.Scanln(&z);默认会转成整数
	switch test(z) +1 {
	case 'a':
		fmt.Println("穿衣服a")
	case 'b':
		fmt.Println("穿衣服b")
	case 'c':
		fmt.Println("穿衣服c")
		fallthrough
	case 'd':
		fmt.Println("穿衣服d")
		
	case 'e':
		fmt.Println("穿衣服e")
	case 'f':
		fmt.Println("穿衣服f")
	case 'g':
		fmt.Println("穿衣服g")
	default:
		fmt.Println("输入错误")
	}


}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo09\main.go
// b
// 穿衣服d

  

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

package main

import (
	"fmt"
	//"math"
)
// package main

// import (
// 	"fmt"
// 	//"math"
// )
// func test (chra byte) byte{
// 	return chra + 1
// }


func main(){

   var n1 int32 = 20
  // var n2 int32 = 20
   var n2 int64 = 20 // 报数据类型不匹配 invalid case n2 in switch on n1 (mismatched types int64 and int32)
   switch n1 {
   		case n2:// 
			fmt.Println("ok1")
		default :
			fmt.Println("没有匹配到")
   }

}

  

3)case 后面可以带多个表达式,使用逗号隔开;如case 表达式1,表达式2....

package main

import (
	"fmt"
	//"math"
)

// func test (chra byte) byte{
// 	return chra + 1
// }


func main(){

   var n1 int32 = 20
   var n2 int32 = 20
  // var n2 int64 = 20 // 报数据类型不匹配 invalid case n2 in switch on n1 (mismatched types int64 and int32)
   switch n1 {
   		case n2, 10, 5:// 可以有多个表达式
			fmt.Println("ok1")
		default :
			fmt.Println("没有匹配到")
   }

}

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

package main

import (
	"fmt"
	//"math"
)

// func test (chra byte) byte{
// 	return chra + 1
// }


func main(){

   var n1 int32 = 20
   var n2 int32 = 20
  // var n2 int64 = 20 // 报数据类型不匹配 invalid case n2 in switch on n1 (mismatched types int64 and int32)
   switch n1 {
   		case n2, 10, 5:// 
			fmt.Println("ok1")
    	case 5://不允许
			fmt.Println("ok2") //duplicate case 5 (constant of type int32) in expression switch
		default :
			fmt.Println("没有匹配到")
   }

}

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

6)default语句不是必须得

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

package main

import (
	"fmt"
	//"math"
)


func main(){

   var score int = 30
   switch{
   case score >90:
		fmt.Println("优秀")
   case score >=70 && score <=90:
		fmt.Println("优良")
   case score >=60 && score <70 :
		fmt.Println("成绩及格")
	default : 
		fmt.Println("不及格")
   }
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo09\main.go
// 不及格

  

8)switch 后面可以声明定义变量,分号隔开,不推荐

   var score int = 30
   switch{
   case score >90:
		fmt.Println("优秀")
   case score >=70 && score <=90:
		fmt.Println("优良")
   case score >=60 && score <70 :
		fmt.Println("成绩及格")
	default : 
		fmt.Println("不及格")
   }

  

9)switch 穿透fallthrough,如果case 语句块后执行fallthrough,则继续执行下一个case 语句块;也叫switch 穿透

package main

import (
	"fmt"
	//"math"
)


func main(){


   var i int = 10 
   switch i {
   case 10:
		fmt.Println("10")
		fallthrough // 穿透
   case 11:
		fmt.Println("12") //执行
   case 12:
		fmt.Println("13")
   } 
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo09\main.go
// 11
// 12

  

10)Type switch switch语句还可以用来判断某个interface变量中实际指向的变量类型

 

 

示例

package main

import (
	"fmt"
	//"math"
)


func main(){
	var i byte
	fmt.Println("输入要转换的字符")
	fmt.Scanf("%c",&i)
	switch i {
	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")
	}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo11\main.go
// 输入要转换的字符
// a
// A
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo11\main.go
// 输入要转换的字符
// g
// other

  示例2

package main

import (
	"fmt"
	//"math"
)


func main(){
	var s int
	fmt.Println("输入成绩")
	fmt.Scanln(&s)
	switch {
	case s > 100 :
		fmt.Println("输入错误")
	case s >= 60 :
		fmt.Println("合格")
	default:
		fmt.Println("不合格")
	}

		
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo11\main.go
// 输入成绩
// 80
// 合格

  示例3

package main

import (
	"fmt"
	//"math"
)


func main(){
	var x int 
	fmt.Println("输入月份")
	fmt.Scanln(&x)
	switch {
	case x >=3 && x <=5 :
		fmt.Println("春季")
	case x >=6 && x <=8 :
		fmt.Println("夏季")
	case x >=9 && x <=11 :
		fmt.Println("秋季")
	case x <=2 || x == 12 :
		fmt.Println("冬季")
	default:
		fmt.Println("输入错误")
	}

		
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo12\main.go
// 输入月份
// 7
// 夏季
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo12\main.go
// 输入月份
// 10
// 秋季
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo12\main.go
// 输入月份
// 1
// 冬季
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo12\main.go
// 输入月份
// 2
// 冬季

  示例4

package main

import (
	"fmt"
	//"math"
)


func main(){
	var q string
	fmt.Println("输入对应星期几")
	fmt.Scanln(&q)
	switch q{
	case "星期一":
		fmt.Printf("干煸豆角")
	case "星期二":
		fmt.Printf("醋溜土豆")
	case "星期三":
		fmt.Printf("红烧狮子头")
	case "星期四":
		fmt.Printf("油炸花生米")
	case "星期五":
		fmt.Printf("蒜蓉扇贝")
	case "星期六":
		fmt.Printf("东北乱炖")
	case "星期日":
		fmt.Printf("大盘鸡")
	default:
		fmt.Println("输入错误")
	}
		
}

// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo13\main.go
// 输入对应星期几
// 星期一
// 干煸豆角

  switch 与if 的区别

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

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

 for 循环控制

基本语法

for 循环变量初始化;循环条件; 循环变量迭代{

  循环操作语句

}

 

示例

package main

import (
	"fmt"
)


func main(){
	for i :=0; i<10;i++{
		fmt.Println("你好,晨曦")
	}
}

// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo14\main.go
// 你好,晨曦
// 你好,晨曦
// 你好,晨曦
// 你好,晨曦
// 你好,晨曦
// 你好,晨曦
// 你好,晨曦
// 你好,晨曦
// 你好,晨曦
// 你好,晨曦

  流程图

image

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

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

for 循环判断条件{

    循环体

}

将初始化和变量迭代写在其他位置

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

for {

   循环执行语句

}

上面写法等价 for ;;;{} 是一个无限循环,通常需要配合break使用

 示例

package main

import (
	"fmt"
)

func main() {
	for i := 0; i < 3; i++ {
		fmt.Println("你好,晨曦")
	}
	fmt.Println("*********************************")
	j := 0
	for j < 3 {
		j++
		fmt.Println("你好,Thanks♪(・ω・)ノ", j)
	}
	fmt.Println("**********************************")
	y := 0
	for {
		//y := 0
		y++
		
		if y > 3 {//
			break
		}
		fmt.Println("你好", y)
	}
	fmt.Println("***************************************")
	t := 0
	for {
		if t < 3{
			t++
			fmt.Println("你好hh",t)
		}else{
			break
		}
		
	}
}

// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo14\main.go
// 你好,晨曦
// 你好,晨曦
// 你好,晨曦
// *********************************
// 你好,Thanks♪(・ω・)ノ 1
// 你好,Thanks♪(・ω・)ノ 2
// 你好,Thanks♪(・ω・)ノ 3
// **********************************
// 你好 1
// 你好 2
// 你好 3
// ***************************************
// 你好hh 1
// 你好hh 2
// 你好hh 3

  4)golang 提供for-range的方法,可以方便遍历字符串和数组

package main

import (
	"fmt"
)

func main() {
	str := "hello,world!北京"
	for _,v := range str{
		fmt.Printf("%c",v)
	}
}


// 执行结果
//hello,world!北京

  示例2

package main

import (
	"fmt"
)

func main() {
	str := "hello,world!北京"
	for i,v := range str{
		fmt.Printf("index=%d val=%c\n",i,v)
	}
}


// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo15\main.go
// index=0 val=h
// index=1 val=e
// index=2 val=l
// index=3 val=l
// index=4 val=o
// index=5 val=,
// index=6 val=w
// index=7 val=o
// index=8 val=r
// index=9 val=l
// index=10 val=d
// index=11 val=!
// index=12 val=北
// index=15 val=京

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

 示例 打印1~100之间所有9的倍数的个数以及和

package main

import (
	"fmt"
)

func main() {
	x :=0
	j :=0
	for i:=1;i<100;i++{
		
		if i % 9 == 0 {
			j ++
			x = i + x 
			//fmt.Printf("%d+%d=%d\n",x,i)
			
		}
	}
	fmt.Println("和",x)
	fmt.Println("数量",j)
	

}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo16\main.go
// 和 594
// 数量 11

  示例2

package main


import (
	"fmt"
)

func main() {
	//var t int 
	for i:=0;i<=6;i++{
		for j :=6;j>=0;j--{
			if (i+j) == 6 {
			fmt.Printf("%d + %d = %d\n",i,j,(i+j) )
			}
		}
	}
	fmt.Println("*******************************")
//优化
	for i:=0;i<=6;i++{
		j:= 6-i
		fmt.Printf("%d + %d = %d\n",i,j,i+j )
	}	

}

// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo17\main.go
// 0 + 6 = 6
// 1 + 5 = 6
// 2 + 4 = 6
// 3 + 3 = 6
// 4 + 2 = 6
// 5 + 1 = 6
// 6 + 0 = 6
// *******************************
// 0 + 6 = 6
// 1 + 5 = 6
// 2 + 4 = 6
// 3 + 3 = 6
// 4 + 2 = 6
// 5 + 1 = 6
// 6 + 0 = 6

  while 和do ...while 的实现

golang 里面没有whille和do...while语法,需要注意,如果需要使用类似的其他语言,可以通过for循环实现其使用效果

1)for 循环实现while

循环初始化

for {

  if 循环条件表达式{

  break //跳出循环

}

循环操作(语句)

循环变量

}

 

image

 多重循环控制

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

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

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

示例

package main


import (
	"fmt"
)

func main() {
	var x int //所有班级学生成绩
	for j:=1;j<3;j++{
		
		var a int=0 // 班级所有成绩和
		for i:=1;i<5;i++{
			var s int=0 //学生成绩
			fmt.Println("输入班级",j,"学生编号",i,"学生成绩")
			fmt.Scanln(&s)
			a += s
		}
		fmt.Println("平均成绩",a/5)
		x += a		
	}
	fmt.Println("所有班级平均分",x/15)
}

// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo18\main.go
// 输入班级 1 学生编号 1 学生成绩
// 89
// 输入班级 1 学生编号 2 学生成绩
// 67
// 输入班级 1 学生编号 3 学生成绩
// 87
// 输入班级 1 学生编号 4 学生成绩
// 45
// 输入班级 1 学生编号 5 学生成绩
// 88
// 平均成绩 75
// 输入班级 2 学生编号 1 学生成绩
// 79
// 输入班级 2 学生编号 2 学生成绩
// 98
// 输入班级 2 学生编号 3 学生成绩
// 96
// 输入班级 2 学生编号 4 学生成绩
// 76
// 输入班级 2 学生编号 5 学生成绩
// 67
// 平均成绩 83
// 输入班级 3 学生编号 1 学生成绩
// 88
// 输入班级 3 学生编号 2 学生成绩
// 96
// 输入班级 3 学生编号 3 学生成绩
// 75
// 输入班级 3 学生编号 4 学生成绩
// 68
// 输入班级 3 学生编号 5 学生成绩
// 95
// 平均成绩 84
// 所有班级平均分 80

  改进示例

package main
import (
	"fmt"
)

func main() {
	var x int //所有班级学生成绩
	var p int = 0// 及格人数
	for j:=1;j<4;j++{
		
		var a int=0 // 班级所有成绩和
		for i:=1;i<5;i++{
			var s int=0 //学生成绩
			fmt.Println("输入班级",j,"学生编号",i,"学生成绩")
			fmt.Scanln(&s)
			if s > 59{
				p ++
			}
			a += s
		}
		fmt.Println("平均成绩",a/5)
		x += a		
	}
	fmt.Println("所有班级平均分",x/15)
	fmt.Println("及格人数",p)
}

// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo18\main.go
// 输入班级 1 学生编号 1 学生成绩
// 98
// 输入班级 1 学生编号 2 学生成绩
// 54
// 输入班级 1 学生编号 3 学生成绩
// 43
// 输入班级 1 学生编号 4 学生成绩
// 89
// 平均成绩 56
// 输入班级 2 学生编号 1 学生成绩
// 87
// 输入班级 2 学生编号 2 学生成绩
// 45
// 输入班级 2 学生编号 3 学生成绩
// 68
// 输入班级 2 学生编号 4 学生成绩
// 87
// 平均成绩 57
// 输入班级 3 学生编号 1 学生成绩
// 98
// 输入班级 3 学生编号 2 学生成绩
// 67
// 输入班级 3 学生编号 3 学生成绩
// 54
// 输入班级 3 学生编号 4 学生成绩
// 32
// 平均成绩 50
// 所有班级平均分 54
// 及格人数 7

  打印金字塔

package main


import (
	"fmt"
)

func main() {
	// //i 表示层数
	// for i := 0; i<10;i++{
	// 	//j表示打印*
	// 	for j:=0;j<10;j++{
	// 		fmt.Printf("*")
	// 	}
	// 	fmt.Println("")
	// }
	fmt.Println("-----------------------------")
	for i := 1; i<=10;i++{
		for c :=1;c<=10-i;c++{
			fmt.Printf(" ")
		}
	
		//j表示打印*
		for j:=1;j<=i*2-1;j++{
			if j == 1|| j == 2*i-1 || i == 10{// 判断第一个,最后一个;最后一行
			 fmt.Printf("*")
			}else {
				fmt.Printf(" ")
			}
		}
		fmt.Println("")
	}
	fmt.Println("===========================")
	for i :=1;i <=5;i++{
		for k :=1; k<=5-i;k++{
			fmt.Printf(" ")
		}
		for g :=1; g<=2*i-1;g++{
			fmt.Printf("*")
		}
		fmt.Println()
	}
	fmt.Println("------------------------------")
	var h int = 5
	// fmt.Println("输入层数")
	// fmt.Scanln(&h)
	for i:=1;i<=h;i++{ //层数
		//打印左侧空行
		for j:=1; j<=h-i;j++{ 
			fmt.Printf(" ")
		}
		for k:=1; k<=2*i-1;k++{
			if k==1 || k==2*i-1 || i==h{// 第一个打印* 最后一行打印* ;最后一行全打印*
				fmt.Printf("*")
			}else{
				fmt.Printf(" ")
			}
			
		}
		
		fmt.Println()
	}
	
}

// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo19\main.go
// -----------------------------
//          *
//         * *
//        *   *
//       *     *
//      *       *
//     *         *
//    *           *
//   *             *
//  *               *
// *******************
// ===========================
//     *
//    ***
//   *****
//  *******
// *********
// ------------------------------
//     *
//    * *
//   *   *
//  *     *
// *********

  分析

image

 

image

 九九乘法表

package main


import (
	"fmt"
)

func main() {
	for i:=1;i<10;i++{
		//fmt.Println(i)
		for j := 1; j <= i ;j++{
			fmt.Printf("%d * %d = %d ",j,i,(i*j))
			fmt.Printf("      ")
		}
		fmt.Println("")
	}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo20\main.go
// 1 * 1 = 1       
// 1 * 2 = 2       2 * 2 = 4
// 1 * 3 = 3       2 * 3 = 6       3 * 3 = 9
// 1 * 4 = 4       2 * 4 = 8       3 * 4 = 12       4 * 4 = 16
// 1 * 5 = 5       2 * 5 = 10       3 * 5 = 15       4 * 5 = 20       5 * 5 = 25
// 1 * 6 = 6       2 * 6 = 12       3 * 6 = 18       4 * 6 = 24       5 * 6 = 30       6 * 6 = 36
// 1 * 7 = 7       2 * 7 = 14       3 * 7 = 21       4 * 7 = 28       5 * 7 = 35       6 * 7 = 42       7 * 7 = 49
// 1 * 8 = 8       2 * 8 = 16       3 * 8 = 24       4 * 8 = 32       5 * 8 = 40       6 * 8 = 48       7 * 8 = 56       8 * 8 = 64
// 1 * 9 = 9       2 * 9 = 18       3 * 9 = 27       4 * 9 = 36       5 * 9 = 45       6 * 9 = 54       7 * 9 = 63       8 * 9 = 72       9 * 9 = 81

  break 介绍

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

流程图

image

 

示例

package main
import (
	"fmt"
	//"strconv"
	"math/rand"
	//"time"
)
func main() {
		//rand.Seed(time.Now().Unix())
	 	//  n:=rand.Intn(100)+1
		//  fmt.Println(n)
	var count int = 0
	for {
		//生成一个随机数,还需要rand设置一个种
		//time.Now().Unix():返回一个从1970:01:01 的0时0分0秒到现在的一个秒数
		//rand.Seed(time.Now().Unix())
		n:=rand.Intn(100)+1
		count ++
		if n==99{
			break
		}
		//fmt.Println(n)
	}
	fmt.Println(count)

}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo21\main.go
// 7

  跳转控制语句break

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

2)标签的基本使用

label1: {

label2: {

label3: {

}

}

}

示例1

package main
import (
	"fmt"
)
func main() {

	for i:=0;i<4;i++{
		for j:=0; j< 10;j++{
			if j == 2{
				break// 默认跳出最近循环
			}
				fmt.Println("j=",j)
		}
	}

}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo21\main.go
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo21\main.go
// j= 0
// j= 1
// j= 0
// j= 1
// j= 0
// j= 1
// j= 0
// j= 1

  示例2

package main
import (
	"fmt"
	//"strconv"
	//"math/rand"
	//"time"
)
func main() {
	label1: //标签1
	for i:=0;i<4;i++{
		label2: //标签2
		for j:=0; j< 10;j++{
			fmt.Println("j=",j)
			if j == 2{
				break label1 // 终止标签1的循环
			}else{
				break label2 // 终止标签2的循环
			}
				
		}
	}

}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo21\main.go
// j= 0
// j= 0
// j= 0
// j= 0

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

package main
import (
	"fmt"
	//"strconv"
	//"math/rand"
	//"time"
)
func main() {
	label1:
	for i :=1;i<100;i++{
		for j :=1;j<100;j++{
			if i + j > 20 {
				fmt.Println(i,"加",j,"和大于20等于",i+j)
				break label1
			} 
		}
	}
	logchance :=3
	for i := 1;i<=3;i++{
		var name string
		var pwd string
		fmt.Println("请输入用户名")
		fmt.Scanln(&name)
		fmt.Println("请输入密码")
		fmt.Scanln(&pwd)
		if name == "张无忌" && pwd == "888" {
			fmt.Println("恭喜登录成功")
			break
		}else{
			logchance --
			fmt.Println("你还有",logchance,"次机会,请珍惜")
		}
	} 
	
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo22\main.go
// 1 加 20 和大于20等于 21
// 请输入用户名
// 张无忌
// 请输入密码
// 888
// 恭喜登录成功

  跳转控制语句continue

基本介绍

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

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

基本语法

{

continue 

}

流程图

image

 示例

package main
import (
	"fmt"

)
func main() {
	
	for j:=0; j< 5;j++{
			
		if j == 2{
			continue
		}
			fmt.Println("j=",j)		
	}
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo21\main.go
// j= 0
// j= 1
// j= 3
// j= 4

  示例

package main
import (
	"fmt"
)
func main() {
	for i:=1;i<10;i++{
		if i % 2 == 0{
			continue
		}
		fmt.Println(i)
	}

}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo24\main.go
// 1
// 3
// 5
// 7
// 9

  示例

package main

import (
	
	"fmt"
)
func main() {

	var z int
	var f int 
	for {
		var x int 
		fmt.Println("输入一个数字")
		fmt.Scanln(&x)
		if x > 0{
			z++
		}else if x == 0{
			fmt.Println("输入为0无法继续输入")
			break
		}else{
			f++
		}
	}
	fmt.Printf("输入正数个数%v,负数个数%v",z,f)	
	

}
// 执行结果

// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo24\main.go
// 输入一个数字
// 89
// 输入一个数字
// 65
// 输入一个数字
// -98
// 输入一个数字
// 65
// 输入一个数字
// -97
// 输入一个数字
// -8
// 输入一个数字
// 3
// 输入一个数字
// 0
// 输入为0无法继续输入
// 输入正数个数4,负数个数3

  示例

package main

import (
	"fmt"
)
func main() {
	sa :=100000.00
	var w int 
	for {
		if sa > 50000.00 {
			sa = sa - sa * 0.05
			w++
			//fmt.Println(sa)
		}else if sa <=50000.00&& sa>0{
			sa -= 1000
			w++
			//fmt.Println(sa)
		}else {
			break
		}
	}
	fmt.Printf("该人可以经过%v次路口",w)
}
// 执行结果
// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo24\main.go
// 该人可以经过63次路口

  跳转控制语句goto

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

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

3)在go 程序设计中一般不主张使用goto,以免造成程序流程混乱,使理解和程序调试造成困扰

基础语法

goto label

label: statement 

流程图

image

示例

package main

import (
	//"crypto/x509"
	"fmt"
)
func main() {
    fmt.Println("ok1")
	goto abc
    fmt.Println("ok2")
    fmt.Println("ok3")
    fmt.Println("ok4")
    fmt.Println("ok5")
	abc:
    fmt.Println("ok6")
    fmt.Println("ok7")
    fmt.Println("ok8")
    fmt.Println("ok9")
    fmt.Println("ok10")
    fmt.Println("ok11")

}
// 执行结果

// PS D:\golang\goproject\src\src01\go_code> go run src\chapter04\demo26\main.go
// ok1
// ok6
// ok7
// ok8
// ok9
// ok10
// ok11

  跳转控制语句return

return 使用在方法里,表示跳出所在的函数或方法,在函数的时候,会详细介绍

 

image

 

posted @ 2026-03-01 19:48  烟雨楼台,行云流水  阅读(6)  评论(0)    收藏  举报