流程控制之if-else语句
语法结构为:
if condition1{
代码块1
}else if condition2{
代码块2
}else{
代码块3
}
一个判断年龄的小案例:
//流程控制之if-else循环
package main
import (
"fmt"
"strconv"
)
func judgeA(age int)(msg string){
if age <= 18{
msg = "to young"
}else if age > 18 && age <= 30{
msg = "it is suitable"
}else{
msg = "to old"
}
return
}
func main() {
var input string
var msg string
fmt.Println("请输入您的年龄:")
fmt.Scanf("%s",&input)
age,err := strconv.Atoi(input)
if err != nil{
fmt.Print(err)
}else{
msg = judgeA(age)
fmt.Printf("%s\n",msg)
}
}
if还有另外一种形式,它包含了一个statement可选语句部分,该组件在条件判断之前运行。其语法是:
if statement;condition1{
代码块1
}
一个判断奇数偶数的案例:
package main
import (
"fmt"
"strconv"
)
func CalcA(n int)(msg string){
if num:=n;num%2 == 0{
msg = "是偶数"
}else{
msg = "是奇数"
}
return
}
func main() {
var input,msg string
fmt.Printf("请输入一个正整数:\n")
fmt.Scanf("%s",&input)
if num,err := strconv.Atoi(input);err != nil{
fmt.Print(err)
}else{
msg = CalcA(num)
fmt.Println(msg)
}
}
注意点:
(1)else语句应该放在if语句的大括号}之后的同一行中。如果不是,编译器不会通过。
这是因为在Go语言中,分号是自动插入的,如果else换行了,表示上一个if程序结束了,实际上也就变成了:
if num:=n;num%2 == 0{
msg = "是偶数"
};
else{
msg = "是奇数"
}
/*
syntax error: unexpected else, expecting }
*/
流程控制之for循环
for循环是go语言之中的唯一循环语句,它不像python之中有while循环,也不像C中有do while循环。
for循环的语法结构
for initialisation; condition; post{
代码块
}
初始化语句只会执行一次。循环初始化后,将检查循环条件,如果条件的计算结果为true,则{}内的循环体将执行,接着执行post语句,post语句将在每次成功循环迭代后执行。在执行完post语句后,condition将被再次检查,如果条件为true,则循环将继续执行;否则for循环将终止
经典案例: 打印99乘法表
package main
import "fmt"
func multiTable(){
for j:=1;j<10;j++{
i := 1
for i<=j {
fmt.Printf("%dx%d=%d\t",i,j,i*j)
i++
}
fmt.Println()
}
}
func main() {
//99乘法表的打印
multiTable()
}
经典案例:打印100-1000的水仙花数
//打印100-1000之间的水仙花数
package main
import "fmt"
func cub(n int)int{
return n*n*n
}
func narcis(num int)interface{}{
a := num % 10 // 个位
b := num /10%10 // 十位
c := num /100 // 百位
if num == cub(a)+cub(b)+cub(c){
return num
}else{
return false
}
}
func calcX()(s []int){
for i:=100;i<1000;i++{
res := narcis(i)
switch value:=res.(type) { //使用switch来实现类型断言
case int:
s = append(s,value) //将水仙花数添加到切片中
case bool:
continue
}
}
return
}
func main() {
s := calcX()
for _,value:=range s{
fmt.Printf("%d\n",value)
}
}
break关键字
break 语句用于在完成正常执行之前突然终止 for 循环,之后程序将会在 for 循环下一行代码开始执行。
//break关键字
package main
import "fmt"
func testV(){
for i:=1;i<10;i++{
if i==8{
break
}else{
if i%2 == 0{
fmt.Printf("%d\n",i)
}
}
}
}
func main() {
testV()
}
continue关键字
continue 语句用来跳出 for 循环中当前循环。在 continue 语句后的所有的 for 循环语句都不会在本次循环中执行。循环体会在一下次循环中继续执行。
package main
import "fmt"
func testV(){
for i:=1;i<11;i++{
if i%2 == 0{
if i == 8{
continue
}
fmt.Printf("%d\n",i)
}
}
}
func main() {
testV()
}
流程控制switch语句
switch 是一个条件语句,用于将表达式的值与可能匹配的选项列表进行比较,并根据匹配情况执行相应的代码块。它可以被认为是替代多个 if else 子句的常用方式。
获取当前的时间是周几:
//获取当前的时间是周几
package main
import (
"fmt"
"time"
)
func main() {
fmt.Printf("当前的时间是:%s\n",time.Now().Weekday().String())
}
Switch 是 Go 语言中一种多路条件语句,一般搭配 case 语句使用。
【Switch case】的条件结构如下所示:
switch simpleStatement; condition {
case expression1,expression2:
statements
case expression3:
statements
default:
statements
}
和 if 语句类似,switch 语句也可以在条件语句之前执行一段简短的表达式(可以用于很方便的控制变量的作用域),switch case 开始执行时,会先执行这一个表达式(空也算一种),然后计算出条件语句的值,接着按从上到下,从左到右的顺序一个一个的执行 case 语句的条件表达式,如果值相等的话就会进入执行 case 条件下对应的语句。 如果所有的 case 条件都没有能匹配上的话,然后就会尝试执行 default 下对应的逻辑。
支持类型
不像java中只支持整型,Go里的Switch参数是一个表达式,支持任意类型的比较,甚至 switch 的条件还可以是一个空的,这个时候等价于 switch true,可以用于简化多个 if 条件的场景。
隐式break&fallthrough(可以理解为穿透)
package main
import (
"fmt"
"runtime"
)
func main() {
//在golang中runtime的用法
switch runtime.GOOS { //runtime.GOOS返回目标操作系统
case "linux","darwin":
fmt.Printf("unix")
case "windows":
fmt.Printf("windows")
default:
fmt.Printf("???")
}
}
/*
其他用法:
GOROOT() --> 返回本机的GO路径
NumGoroutine() --> 返回正在执行和排队的任务总数
NumCPU() --> 返回当前系统的CPU核数量
*/
fallthrough (穿透)
func main() {
//在golang中runtime的用法
switch runtime.GOOS {
case "linux","darwin":
fmt.Printf("unix")
fallthrough
case "windows":
fmt.Printf("windows")
fallthrough
default:
fmt.Printf("???")
}
}
/*
windows???
*/
和java,c++不同的是,go是隐式的调用break,显式的调用 fallthrough,而java以及c++是显示的调用break隐式的调用fallthrough
type Switch
Go语言中的switch条件还可以是一种类型,这个特性在一个变量可能是多种类型时非常有用,虽然也可以 if else 加上类型断言来实现
使用Switch 实现类型断言:
package main
import "fmt"
func Stere(n int)int{
return n*n*n
}
func CalcZ(num int)interface{}{
a := num%10
b := num/10%10
c := num/100
if Stere(a)+Stere(b)+Stere(c) == num{
return num
}else{
return false
}
}
func dolphin()(s []int){
for i:=100;i<1000;i++{
res := CalcZ(i)
switch value:=res.(type) {
case int:
s = append(s,value)
case bool:
continue
}
}
return
}
func main() {
for _,value := range dolphin(){
fmt.Printf("%d\n",value)
}
}