Go速成无压力【五】:循环,判断,延迟( for , if-else , switch , defer )

(一)for 循环

Go只有一个循环结构就是for循环,for循环有3个被分号分割的组成部分,分别是:
1,初始化语句
2,条件表达式
3,后声明语句
所在位置情况是:for 初始化语句;条件表达式;后声明语句

for循环的初始化语句是短变量声明,并且这个变量声明的作用域只在for循环语句中,当循环迭代的判断条件变为false后将会停止,不像C,Java,Js等语言的循环语句总是需要带上括号 (),在Go中可以不写括号

package main
import "fmt"
func main(){
	var sum int = 0
	for i:=0 ; i < 50 ; i++ {
		sum+=i
	}
	fmt.Println("从0累加到49后的值为:",sum)
}

在这里插入图片描述



(二)for循环知识扩展

在for循环中,初始化值和后声明语句可以不写,比如for ;i<10; { }

package main
import "fmt"
func main(){
	res := 10
	for ;res<11; {
		res *= res
	}
	fmt.Println(res)
}

在这里插入图片描述



(三)for就是Go的while循环

去掉分号的for循环就是go的while循环,和c的while循环效果是相似的

package main
import "fmt"
func main(){
	res := 10
	for res<100 {
		res+=10
	}
	fmt.Println("res经过while循环后的结果为:",res)
}

在这里插入图片描述



(四)死循环

如果for不设置循环条件,循环将会一直持续下去变成死循环

package main
import "fmt"
func main(){
	for {
	}
}

死循环导致运行超时
在这里插入图片描述



(五)if 语句

if 语句有些像for循环,表达式也不需要括号圆包括,但是花括号是必须的

package main

import (
	"fmt"
	"math"
)

func calcNum(x float64) float64 {
	if x > 0 {
		return math.Sqrt(x * 10)
	}
	return math.Sqrt(x)
}

func main() {
	fmt.Println("\n计算的平方根为:", calcNum(20), "\n")
}

在这里插入图片描述



(六)if 短声明

像 for 一样,if 声明可以在条件之前执行短声明,短声明的变量的作用域仅仅直到 if 结束

package main

import (
	"fmt"
)

func kok(x, y, con float64) float64 {
	if v := x + y; v == con {
		return v
	}
	return con
}

func main() {
	fmt.Println(
		kok(1, 2, 3),
		"\n",
		kok(10, 23, 2),
		"\n",
	)
}

在这里插入图片描述



(七)if…else 语句

变量可以在if 模块里面进行短声明,也可以在else 里面进行短声明

package main
import(
	"fmt"
	"math"
	)

func Alo(v int){
	if v := math.Sqrt(v);v > 30{
		fmt.Println("您的值求平方根后大于30得:",v)
	}else {
		math.Pow(v,v)
		fmt.Println("您的值求平方根后小于30,根据else选择我们选择求平方,结果为:",v)
	}
}

func main(
	Alo(10)
	fmt.Printf()
)

在这里插入图片描述



(七)switch 选择语句

switch是一种用较短的方法去写if-else的声明的方法,在Go语言中,swtich同样没有括号判断,也没有case判断后的break关键字,case判断完成后会自动跳出switch选择 ,终止整个swicth

package main
import (
	"fmt"
	"runtime"
)

func main(){
	switch os := runtime.GOOS; os{
	case "darwin":
		fmt.Println("您使用的操作系统为OS X.")
	case "windows":
		fmt.Print("您使用的操作系统为Windows")
	case "Linux":
		fmt.Print("您使用的操作系统为Linux")
	default :
		fmt.Print("您使用的操作系统为os")
	}
}

使用switch配合runtime进行操作系统的信息检测
在这里插入图片描述



(八)switch 无条件选择

switch选择不设置条件就相当于switch为true,case结构就会变成if-else的模式

package main

import (
	"fmt"
	"time"
)

func main() {
	t := time.Now()
	fmt.Printf("当前时间为:%v", t)
	switch {
	case t.Hour() > 10 && t.Hour() < 22:
		fmt.Println("当前时间位于10点-22点")
	case t.Hour() >= 22:
		fmt.Println("已经22点以后了,夜已深,早点休息")
	}
}

在这里插入图片描述



(九)defer

defer 关键字的使用可以是一个函数被延迟,直到被延迟函数的周围函数都执行完

package main
import "fmt"

func main(){
	defer fmt.Println("你好!")
	fmt.Println("还行!")
}

在这里插入图片描述


如果有多个defer定义,顺序该怎么执行?

如果存在多个defer,执行顺序为从后到前,谁最先被defer定义, 谁就最后输出

前看演示:

package main

import "fmt"

func main() {
	fmt.Println("0!")
	defer fmt.Println("1!")
	defer fmt.Println("2!")
	defer fmt.Println("3!")
	fmt.Println("4!")
}

输出结果为:0,4,3,2,1

在这里插入图片描述
以上示例说明 Go的defer会造成一个堆栈的后进先出(last-in-first-out)顺序,再看一个实例演示便更理解这种顺序

package main
import "fmt"
func main(){
	for i := 0;i < 10 ;i++ {
		defer fmt.Print("当前是第",i,"个数")
	}
	fmt.Print("开始数数!")
}

在这里插入图片描述



猜你喜欢

转载自blog.csdn.net/qq_41136216/article/details/106625453
今日推荐