流程控制之if-else语句

204 阅读4分钟

流程控制之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(可以理解为穿透)

隐式的break

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)
	}
}