if以及if else语句
if 条件表达式{
代码体 ,条件符合则运行这里面的代码
}
if 条件{
表达式
}else if 条件{
}else条件{
}
imooc案例,用了ioutil的方式
func main() {
const filename = "abc.txt"
contents ,err :=ioutil.ReadFile(filename) //ioutil可以读取文件信息
if err!= nil{
fmt.Println(err)
}else {
fmt.Printf("%s\n",contents)
}
fmt.Printf("%s\n",contents)
}
有更简写法为
const filename = "abc.txt"
if contents ,err :=ioutil.ReadFile(filename);err!= nil {
fmt.Println(err)
} else {
fmt.Printf("%s\n",contents)
}
if的条件里可以赋值,if后可以跟多个语句
if的条件里赋值的表量作用域就在if语句中,如例4无法使用fmt.Printf("%s\n",contents)输入内容
switch
switch会自动break,除非使用fallthrough
func grade(score int) string {
g:=""
switch {
case score<0 || score>100:
panic(fmt.Sprintf("wrong score :%d",score))
case score < 60:
g ="F"
case score < 80:
g = "B"
case score < 100:
g = "A"
fmt.Println(
grade(6),
grade(66),
grade(76),
grade(86),
grade(96),
grade(102),
)
输入102是会直接中断输出panic: wrong score :102,所有的数字不计算
switch后可以没有表达式,在case表达就可以
panic是报错停止语句
for
sum:=0
for i :=1;i<5;i++{
sum+=i
}
fmt.Println(sum)
等于10,单用for可以实现无线循环
for {fmt.Println("abc")}
无限打印abc
网易云课堂部分
if支持一个初始化语句,用;分隔开
if score:=150;score>600{
fmt.Println("上清华")
}else if score>400 {
fmt.Println("上白云学院")
}else{
fmt.Println("蓝翔")
}
if的嵌套
if score:=580;score>500{
fmt.Println("入住清华")
if score>520 {
fmt.Println("文科专业")
}else if score>540 {
fmt.Println("计算机专业")
}else {fmt.Println("普通专业")}
} else {
fmt.Println("1")
}
当分数高于540时,无法显示计算机专业
使用倒叙可以显示,因为if程序的运行问题,上面的满足了第一个要求便直接停止了程序,也可以直接嵌套if而不是else if
if score:=510;score>500{
fmt.Println("入住清华")
if score>540 {
fmt.Println("文科专业")
}else if score>520 {
fmt.Println("计算机专业")
}else {fmt.Println("普通专业")}
} else {
fmt.Println("1")
}
switch
switch 变量表达式{
case 值1:
代码体
case 值2:
代码体
default :
代码体
}
//var score int = 80
switch score:=80;score {
case 90:
fmt.Println("A")
case 80,70,60: //多个条件可以放在case后,case支持多个条件的匹配
fmt.Println("B")
//case 70:
// fmt.Println("C")
//case 60:
// fmt.Println("D")
default:
fmt.Println("E")
}
上面代码中,如果输入85,打印E出来,只有数值分别等于90,80,70的时候才会显示ABC,从上到下匹配,匹配到就结束,效率高
switch会自动break,除非使用fallthrough
switch后可以没有表达式,在case表达就可以
score2:=87
switch {
case score2>90:
fmt.Println("A")
case score2>80:
fmt.Println("B")
case score2>70:
fmt.Println("C")
default:
fmt.Println("D")
if和switch语句的选择
优点:
- if语句适合进行区间判断,可以嵌套使用
- switch执行效率高,适合固定值,可以将多个多个满足相同条件的值放在一起
缺点:
- if 执行效率低,适合分支少的
- switch不建议使用嵌套
for循环
a:=0
for i:=0;i<=10;i++{ //for 初始化条件;判断条件;条件变化{代码体}
a+=i
}
fmt.Println(a)
for语句的结构
//for 初始化条件;判断条件;条件变化{代码体}
for的3种使用格式
- for 表达式1;表达式2;表达式3{ }
- for 返回值 :=range加集合{ }
- for 条件{}
range
输出两个值,分别是下标和值
下标在前可用_(匿名变量)代替
str:="abcdefg"
for i:=0;i<len(str);i++{
fmt.Printf("str[%d]=%c\n",i,str[i])
}
//迭代打印
//打印两个元素,默认返回两个值,第一个元素位置吗,第二个元素本体
for i ,data:=range str{
fmt.Println(i,data)
}
for _,i:=range str{
fmt.Println(i)
}
第一个方位较为的复杂,没有使用range,但比较以东
用range能打印出结果为
0 97
1 98
2 99
3 100
4 101
5 102
6 103
97
98
99
100
101
102
103
可以通过Printf来转换,让他表达清晰一点
for循环嵌套
百钱白鸡问题
公鸡5钱,母鸡3钱,3个鸡仔1钱
number:=0
//百钱百鸡
for a:=0;a<=20;a++{
for b:=0;b<=33;b++{
for c:=0;c<=100;c+=3 {
if a+b+c == 100 && a*5+b*3+c/3 == 100 {
fmt.Println(a,b,c)
}
number++
}
}
}
fmt.Println(number)
24276种组合,4个答案符合要求
注意if的使用,只是我自己没有想到的
需要尽量的避免多层的使用的嵌套
下面的方法只使用2个嵌套,组合有714个,答案一样
for a:=0;a<=20;a++{
for b:=0;b<=33;b++{
c:=100-a-b
if c%3 == 0 && a*5+b*3+c/3 == 100 {
fmt.Println(a,b,c)
}
number++
}
}
跳转语句
break和continue个goto
break跳出循环,如果多层for循环,跳出最近的内循环
continue跳出本次循环,进入下个循环,只能在for循环使用
goto
fmt.Println("aaaaaaaaaaaa")
goto end
fmt.Println("bbbbbbbbbb")
end:
fmt.Println("cccccccccccccc")