if else
分为
单分支
if 条件表达式{
执行代码
}
双分支
if 条件表达式{
执行代码
}else{
执行代码
}
多分支
if 条件表达式{
执行代码
}else if 表达条件{
执行代码
}else if 表达条件{
执行代码
}
swhitch
func main(){
fmt.Println("请输入 今天星期几")
var zhou string
fmt.Scanf("%v",&zhou)
switch zhou{
case "星期一":
fmt.Println("红烧鱼")
case "星期二":
fmt.Println("红烧鸡爪")
case "星期三":
fmt.Println("红烧兔子")
case "星期四":
fmt.Println("红烧猪头")
default:
fmt.Println("输出错误")
}
swhitch细节
case内的值不能重复
比如
var i int = 10
var j int = 10
for i {
case 10:
fmt.Println("ok")
case j:
fmt.Println("ok1")
default:
fmt.Println("报错")
}
//他会输出 ok 因为他会先进入 第一个 case进行判断 判断成功直接出来
如果第一个 case和第二个 都是 10的话 会直接报错
switch中的穿透 fallthrough
什么是穿透 呢
var num int = 10
switch num {
case 10:
fmt.Println("ok1")
fallthrough
case 20:
fmt.Println("ok2")
case 30:
fmt.Println("ok3")
default:
fmt.Println("匹配")
}
就像代码段里的mun等于 10 不添加穿透的话 输出的是 ok1
但是case 10 下面加了 fallthrough
就会把 ok1 和下面的 ok2 一起输出 当然 只有 case 10判断成功了 加了fallthrough才会输出 case 20
如果case判断不成功 当然fallthrough就不会生效
for循环
func main(){
// var i int
// var j =1
// for i= 1; ;i++ {
// j +=j
// fmt.Println(j)
// }
// fmt.Println(i)
//for 循环的第三种写法
var k int = 1
for{
if k<= 10{
fmt.Println("ok")
}else{
break
}
k++
}
var str = "abcdefg"
for a,b :=range str{
fmt.Printf("a=%d b =%c\n",a,b)
}
输出字符串是以
for 数组变量 ,数组对应字符变量 :=range 字符串变量 {
xxxx
}
进行输出的 、
想要输出汉字需要使用[]]rune(str)
var str = []rune("abcdefg王启龙")
//正常情况下 汉字占用 三个位置 想要输出 汉字 需要使用 切片 []rune() 切片进行强制转换
//或者使用新的函数 进行赋值 i = []]rune(str)
for a,b :=range str{
fmt.Printf("a=%d b =%c\n",a,b)
}
for循环中 实现 do while
for循环中有个break
作用是 跳出for循环
break 跳出 for或者 跳出 switch
n1: //生成 一个冒号结束的 标签 然后 下面 break 引用这个 函数
//使break直接 跳出 第一个 for循环 因为 定义的 那个标签是在 第一个 for循环外面的
for i := 1;i<= 4;i++{
for j :=1 ;j<=4; j++{
if j==3 {
break n1
}
fmt.Println("j=",j)
}
}
上面定义 的 n1:标签
作用是 绑定下面第一个 for循环 下面的 break直接 操作 结束 第一个 for循环
跳转控制语句 continue
结束本次循环 并不是 像 break一样直接 跳出 循环
for i :=1;i<=4;i++{
for j:=1;j<=4;j++{
if j==3{
continue
}
//fmt.Println("i=",i)
fmt.Println("j-=",j)
}
}
输出结果是 四遍 1 2 4
不输出3
练习
使用 for循环 continue break
输出一个数 判断是正数还是负数 最后输出 输出的所有数的正数负数各多少 输入0结束
var fInt int //接收正数
var zInt int //接受负数
var num int //输入值
for {
fmt.Println("请输入一个整数 0退出程序")
fmt.Scanln(&num)//接收整数
if num == 0{
break
//判断输入0break退出程序
}
if num >0 {
zInt++
continue
//判断为正数退出本次循环
}else{
fInt++
//为负数负数+1
}
}
fmt.Printf("正数个数为%v 负数个数为%v",zInt,fInt)
// 携带100000元 过告诉需要交高速费
// 当钱大于50000时 每次交现有钱的百分之五
// 当小于等于50000时 每次交一千
// 算出一共交了多少次高速费
var money float32 =100000
var num int
for {
if money <1000{
break
//小于1000钱不够了 退出
}
if money >50000{
money-=money*0.05//总钱数-=百分之五
num++
}else{
money-=1000//总钱数-=1000
num++
}
}
fmt.Println(num)
算法 冒泡排序
使用 冒泡排序对一个数组 进行排序
func main (){
//[14]int 里面的14的意思是这个数组一共十四位 多的就会用0代替 少的会报错
var num = [14]int {45,454,6456,484,54854,54,8,4,4456,46,46,46,46,46,}
for i :=0 ;i<len(num)-1;i++{//因为数组第一位是从0计算 所以从0到13刚好14位 所以 num长度-1
for j :=0 ;j<len(num)-1-i;j++{//外层循环走一次 内层循环走一圈 所以第一次判断就把最大或者最小的数排到最后面 所以需要减去i
if num[j]>num[j+1]{
num[j],num[j+1] = num[j+1],num[j]
}
}
}
fmt.Println("排序后的num=",num)
}
goto的使用
goto一般不建议使用 他会打乱 代码的正常运行 除非破不得已
func main(){
var n int = 10
fmt.Println("123")
if n==10{
goto n1//goto一般配合if语句进行使用
}
fmt.Println("456")
fmt.Println("789")
fmt.Println("000")
//条件成立 会直接 跳到 n1下面的 111 输出结果就是 123 111
n1:
fmt.Println("111")
}
return
return是直接跳出整个函数 项目一般会有很多个函数
return直接 跳出当前函数
如果return在main函数内 就是i直接 退出该程序 //main函数是整个程序的入口