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("開始數數!")
}

在這裏插入圖片描述



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章