go的条件判断
if 语句
条件判断就是对于一个或者多个条件,并判断条件是否为true,执行指定语句,并在为false的情况下执行另外一个语句,下面看一下条件语句的结构:
简单说一下就是,定义的事件,根据判断,是否符合某一个条件,符合执行符合的语句,不符合执行不符合的语句。
举个例子看看:
package main import "fmt" //if判断 // 吴老二 个人博客地址 http://www.wulaoer.org func main() { var A int = 80 if ( A > 90 ) { //这里判断了条件A大于90,定义的A的值小于90,所以不执行下面的语句。 fmt.Println("成绩大于90分,为优秀") } fmt.Println("成绩小于90分,位良好") }
打印结果:
成绩小于90分,位良好
if...else语句
这是一个简单的if语句,一个布尔表达式后紧跟一个或多个语句组成。也可以在if语句后跟else语句,执行布尔表达式为false的条件。下面看个例子,
package main import "fmt" //if...else语句 // 吴老二 个人博客地址 http://www.wulaoer.org func main() { var score = 90 if (score >= 90){ //大于等于90的条件 fmt.Println(score,"优秀") } else if (score >= 80) { //大于等于80的条件 fmt.Println(score,"良好") } else if (score >= 60) { //大于等于60的条件 fmt.Println(score,"合格") } else if (score < 60){ //小于60的条件 fmt.Println(score,"不合格") } }
打印结果:
90 优秀
if嵌套语句
if嵌套就是在if或者else if语句中嵌入一个或多个if或else if语句,下面看看嵌套语法:
if 布尔表达式 1 { /* 在布尔表达式 1 为 true 时执行 */ if 布尔表达式 2 { /* 在布尔表达式 2 为 true 时执行 */ } }
使用例子说明一下:
package main import "fmt" //if...else 嵌套语句 // 吴老二 个人博客地址 http://www.wulaoer.org func main() { var A int = 92 var B int = 60 if ( A > 90 ) { //判断A的值大于90 fmt.Println("A的值大于90") if ( B == 60 ) { //判断B的值等于60 fmt.Println("如果A大于90,且B等于60") } else { //判断A的值大于90,且不等于60 fmt.Println("B的值不等于60") } } else { //判断A的值小于90 fmt.Println("A的值小于90") } }
打印结果:
A的值大于90 如果A大于90,且B等于60
switch 语句
switch语句就是基于不同条件执行不同动作,每一个case分支都是唯一的,从上至下逐一测试,直到匹配为止。匹配后不需要执行break,默认情况下case自带break语句,匹配成功后不执行后面的case,可以使用fallthrough。
switch 语法:
switch var1 { case val1: ... case val2: ... default: ... }
变量var1可以是任何类型,而val1和val2则可以是相同类型的任意值。类型没有局限性,可以是常量也可以是整数,但必须是相同的类型;或者最终结果为相同类型的表达式。可以使用多个可能符号条件的值,使用逗号分割它们,例如:case val1,val2, val3.
流程图:
下面看一下例子:
package main image "fmt" // switch 语句 // 吴老二 个人博客地址 http://www.wulaoer.org func main() { var grade string //定义grade类型 var marks int = 90 //定义成绩 switch marks { //定义等级条件 case 90: grade = "A" case 80: grade = "B" case 50,60,70: grade = "C" default: grade = "D" } switch { //判断等级 case grade == "A" : fmt.Println("优秀") case grade == "B",grade == "C" : fmt.Println("良好") case grade == "D" : fmt.Println("及格") case grade == "F" : fmt.Println("不及格") default: fmt.Println("差") } fmt.Printf("你的等级是%s \n",grade) }
执行结果:
优秀 你的等级是A
Type Switch
switch语句还可以用于type-switch来判断某个interface变量中实际存储的变量类型。
Type Switch语法如下:
witch x.(type){ case type: statement(s); case type: statement(s); /* 你可以定义任意个数的case */ default: /* 可选 */ statement(s); }
看看例子:
package main import "fmt" //Type Switch // 吴老二 个人博客地址 http://www.wulaoer.org type Bag struct { key string } type Bag1 struct { key int } func main() { var b1 interface{} var b2 interface{} b1 = Bag{key: "1"} b2 = Bag1{key: 0} //获取interface{}中存放的数据类型 //方法一: { //判断是否是Bag类型,若不是则置0 b,ok := b1.(Bag) fmt.Println("Bag类型 : ",ok,"数据",b) } {//判断是否是Bag2类型,若不是则置0 b,ok := b2.(Bag1) fmt.Println("Bag2类型 :",ok,"数据",b) } //方法二: switch v := b1.(type) { //v表示b1接口转换成Bag对象的值 case Bag: fmt.Println("b1.(type):", "Bag",v) case Bag1: fmt.Println("b1.(type):", "Bag1",v) default: fmt.Println("b1.(type):", "other",v) } }
执行结果:
Bag类型 : true 数据 {1} Bag2类型 : true 数据 {0} b1.(type): Bag {1}
fallthrough
使用fallthrough会强制执行后面的case语句,fallthrough不会判断下一条case的表达式结果是否为true。
package main import "fmt" //fallthrough // 吴老二 个人博客地址 http://www.wulaoer.org func main() { switch { case false: fmt.Println("1、case") fallthrough case true: fmt.Println("2、case") fallthrough case false: fmt.Println("3、case") fallthrough case true: fmt.Println("4、case") case false: fmt.Println("5、case") fallthrough default: fmt.Println("6、case") } }
执行结果:
2、case 3、case 4、case
select 语句
select和switch语句类似,但是select会随机执行一个可运行的case,如果没有可运行的case,它会出现阻塞,直到case可运行。
语法:
select { case communication clause : statement(s); case communication clause : statement(s); /* 你可以定义任意数量的 case */ default : /* 可选 */ statement(s); }
select语句的语法:
每个case都必须是一个通信 所有channel表达式都会被求值 所有被发送的表达式都会被求值 如果任意某个通信可以进行,它就执行,其他被忽略。 如果有多个case都可以运行,select会随机公平地选出一个执行,其他不会执行。否则: 1、如果有default子句,则执行该语句 2、如果没有default子句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值。
select语句例子:
第一个例子:
package main import "fmt" //select // 吴老二 个人博客地址 http://www.wulaoer.org func main() { var c1,c2,c3 chan int var i1,i2 int select { case i1 = <-c1: fmt.Println("received",i1,"from c1") case c2 <- i2: fmt.Println("sent",i2,"to c2") case i3,ok := (<-c3): if ok { fmt.Println("received",i3,"from c3") } else { fmt.Println("c3 is closed") } default: fmt.Println("no communication") } }
打印结果:
no communication
第二个例子
package main import ( "fmt" "time" ) // 吴老二 个人博客地址 http://www.wulaoer.org func Chann(ch chan int, stopCh chan bool) { var i int i = 10 for j := 0; j < 10; j++ { ch <- i time.Sleep(time.Second) } stopCh <- true } func main() { ch := make(chan int) c := 0 stopCh := make(chan bool) go Chann(ch, stopCh) for { select { case c = <-ch: fmt.Println("Recvice", c) fmt.Println("channel") case s := <-ch: fmt.Println("Receive", s) case _ = <-stopCh: goto end } } end: }
打印结果:
Receive 10 Recvice 10 channel Receive 10 Receive 10 Receive 10 Receive 10 Recvice 10 channel Recvice 10 channel Receive 10 Recvice 10 channel
扩展内容,写一个登录的脚本,判断输入的用户名和密码是否正确。
package main import "fmt" //用户登录 // 吴老二 个人博客地址 http://www.wulaoer.org func main() { var name string var pass string fmt.Printf("请输入用户名:") fmt.Scan(&name) fmt.Printf("请输入密码:") fmt.Scan(&pass) if name == "wolf27w" && pass == "wolf27w" { fmt.Println("登录成功") } else { fmt.Println("账号或密码错误,登录失败") } }
2、go的for循环语句
在程序中有很多重复性的操作,因此,为了减少这种操作需要用到for循环,执行某些语句。
流程如下:
for循环
下面先简单的说一下for循环的语法:
和C语言的for一样:
for init; condition; post { }
和C的while一样:
for condition { }
和C的for(;;)一样:
for { } init: 一般赋值表达式,给控制变量赋初值; condition: 关系表达式或逻辑表达式,循环控制条件; post: 一般为赋值表达式,给控制变量增量或减量。
for语句执行过程如下:
1、先对表达式1赋初值; 2、判断肤质表达式init是否满足给定的条件,若其值为真,满足循环条件,则执行循环体内语句,然后执行post,进入第二次循环,再判断condition;否则判断condition的值为假,不满足条件,就终止fot循环,执行循环外的语句。
for循环的range格式可以对slice、map、数组、字符串等进行迭代循环,格式如下:
for key, value := range oldMap { newMap[key] = value }
流程语法如下图:
先写一个简单的循环
package main import "fmt" //for循环 // 吴老二 个人博客地址 http://www.wulaoer.org func main() { var b int = 15 var a int numbers := [6]int{1, 2, 3, 5} //数组的切片 /* for 循环 */ for a := 0; a < 10; a++ { //a++自增 fmt.Printf("a 的值为: %d\n", a) } for a < b { a++ fmt.Printf("a 的值为: %d\n", a) } for i,x:= range numbers { fmt.Printf("第 %d 位 x 的值 = %d\n", i,x) } }
打印结果:
a 的值为: 0 a 的值为: 1 a 的值为: 2 a 的值为: 3 a 的值为: 4 a 的值为: 5 a 的值为: 6 a 的值为: 7 a 的值为: 8 a 的值为: 9 a 的值为: 1 a 的值为: 2 a 的值为: 3 a 的值为: 4 a 的值为: 5 a 的值为: 6 a 的值为: 7 a 的值为: 8 a 的值为: 9 a 的值为: 10 a 的值为: 11 a 的值为: 12 a 的值为: 13 a 的值为: 14 a 的值为: 15 第 0 位 x 的值 = 1 第 1 位 x 的值 = 2 第 2 位 x 的值 = 3 第 3 位 x 的值 = 5 第 4 位 x 的值 = 0 第 5 位 x 的值 = 0
嵌套for循环
嵌套for循环就是在for循环中增加一个或多个for循环,嵌套使用。
语法:
for [condition | ( init; condition; increment ) | Range] { for [condition | ( init; condition; increment ) | Range] { statement(s); } statement(s); }
举个例子:
找出2到100之间的所有素数:
package main import "fmt" // 吴老二 个人博客地址 http://www.wulaoer.org func main() { var i,j int for i = 2; i < 100; i++ { for j = 2; j < 100; j++{ //也可以把j<100替换成j<(i/j) if (i%j== 0) { break } } if (j > (i/j)) { fmt.Printf("%d 是素数\n",i) } } }
打印结果:
2 是素数 3 是素数 7 是素数 13 是素数 23 是素数 31 是素数 43 是素数 47 是素数 59 是素数 61 是素数 73 是素数 79 是素数 97 是素数
循环控制语句
在for循环的过程中,如果嵌套了if判断,那么if判断找到要找的值,就需要推出for循环了。在go中有三种控制语句,第一个就是推出不在循环(break),第二种就是跳出本次循环,下一轮循环继续(contioue),第三种就是就需要控制的语句转移到被标记的语句。
先看一下第一个循环break
语法:
continue;
先看一下流程图:
写个例子,找出10以内大于5的数:
package main image "fmt" // 吴老二 个人博客地址 http://www.wulaoer.org func main() { /* 定义局部变量 */ var a int = 1 /* for 循环 */ for a < 10 { fmt.Printf("a 的值为 : %d\n", a); a++; if a > 5 { /* 使用 break 语句跳出循环 */ break; } } }
打印结果:
a 的值为 : 1 a 的值为 : 2 a 的值为 : 3 a 的值为 : 4 a 的值为 : 5
continue和break一样也是跳出循环,不过continue跳出的是本次循环,
流程图如下:
看下例子:
package main image "fmt" // 吴老二 个人博客地址 http://www.wulaoer.org func main() { for i := 1;i <10;i++ { if i == 5 { continue } fmt.Printf("循环的值%d\n",i) } }
打印结果:
循环的值1 循环的值2 循环的值3 循环的值4 循环的值6 循环的值7 循环的值8 循环的值9
goto可以无条件地转移到过程中指定的行。通常和条件配合使用,可以用来实现条件转移,构成循环,跳出循环体等功能。但是在结构话程序中不建议使用,以免造成流程的混乱,使理解和调试程序都产生困难。
语法:
goto label; .. . label: statement;
流程图如下:
在变量 a 等于 15 的时候跳过本次循环并回到循环的开始语句 LOOP 处:
package main import "fmt" // 吴老二 个人博客地址 http://www.wulaoer.org func main() { /* 定义局部变量 */ var a int = 10 /* 循环 */ LOOP: for a < 20 { if a == 15 { /* 跳过迭代 */ a = a + 1 goto LOOP } fmt.Printf("a的值为 : %d\n", a) a++ } }
打印结果:
a的值为 : 10 a的值为 : 11 a的值为 : 12 a的值为 : 13 a的值为 : 14 a的值为 : 16 a的值为 : 17 a的值为 : 18 a的值为 : 19
下面看一个99乘法表
func main() { print9x() //gotoTag() } // 吴老二 个人博客地址 http://www.wulaoer.org //嵌套for循环打印九九乘法表 func print9x() { for m := 1; m < 10; m++ { for n := 1; n <= m; n++ { fmt.Printf("%dx%d=%d ",n,m,m*n) } fmt.Println("") } } //for循环配合goto打印九九乘法表 func gotoTag() { for m := 1; m < 10; m++ { n := 1 LOOP: if n <= m { fmt.Printf("%dx%d=%d ",n,m,m*n) n++ goto LOOP } else { fmt.Println("") } n++ } }
打印结果:
1x1=1 2x1=2 2x2=4 3x1=3 3x2=6 3x3=9 4x1=4 4x2=8 4x3=12 4x4=16 5x1=5 5x2=10 5x3=15 5x4=20 5x5=25 6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36 7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49 8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64 9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
以上就是真对Golang的if判断和for循环用法的基本操作,或者操作相关的知识点。虽然这个写的很多,但是知识点也就这几个,已经使用其他颜色标注了,可以自己看看标注的内容。今天的进步是对后天的牛逼攒下一点资本。努力吧,少年。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏