GO語言基礎語法之控制語句(第十天)

go語言的if 、if else

與C語言相似,除了不需要括號()

Go 語言 switch 語句

switch 語句用於基於不同條件執行不同動作,每一個 case 分支都是唯一的,從上至下逐一測試,直到匹配爲止。

switch 語句執行的過程從上至下,直到找到匹配項,匹配項後面也不需要再加 break。

switch 默認情況下 case 最後自帶 break 語句,匹配成功後就不會執行其他 case,如果我們需要執行後面的 case,可以使用 fallthrough

  1. 語法

Go 編程語言中 switch 語句的語法如下:

switch var1 {
case val1:

case val2:

default:

}

變量 var1 可以是任何類型,而 val1 和 val2 則可以是同類型的任意值。類型不被侷限於常量或整數,但必須是相同的類型;或者最終結果爲相同類型的表達式。

您可以同時測試多個可能符合條件的值,使用逗號分割它們,例如:case val1, val2, val3。

流程圖:
在這裏插入圖片描述

  1. fallthrough
    使用 fallthrough 會強制執行後面的 case 語句,fallthrough 不會判斷下一條 case 的表達式結果是否爲 true。
    switch 從第一個判斷表達式爲 true 的 case 開始執行,如果 case 帶有 fallthrough,程序會繼續執行下一條 case,且它不會去判斷下一個 case 的表達式是否爲 true。
package main

import "fmt"

func main() {

    switch {
    case false:
            fmt.Println("1、case 條件語句爲 false")
            fallthrough
    case true:
            fmt.Println("2、case 條件語句爲 true")
            fallthrough
    case false:
            fmt.Println("3、case 條件語句爲 false")
            fallthrough
    case true:
            fmt.Println("4、case 條件語句爲 true")
    case false:
            fmt.Println("5、case 條件語句爲 false")
            fallthrough
    default:
            fmt.Println("6、默認 case")
    }
}
2case 條件語句爲 true
3case 條件語句爲 false
4case 條件語句爲 true

Process finished with exit code 0

Go 語言 select 語句

select 是 Go 中的一個控制結構,類似於用於通信的 switch 語句。每個 case 必須是一個通信操作,要麼是發送要麼是接收。
select 隨機執行一個可運行的 case。如果沒有 case 可運行,它將阻塞,直到有 case 可運行。一個默認的子句應該總是可運行的
Go 編程語言中 select 語句的語法如下:
select {
case communication clause :
statement(s);
case communication clause :
statement(s);
/* 你可以定義任意數量的 case /
default : /
可選 */
statement(s);
}

以下描述了 select 語句的語法:

  • 每個 case 都必須是一個通信
    所有 channel 表達式都會被求值
    所有被髮送的表達式都會被求值
    如果任意某個通信可以進行,它就執行,其他被忽略。
    如果有多個 case 都可以運行,Select 會隨機公平地選出一個執行。其他不會執行。
    否則:
    如果有 default 子句,則執行該語句。
    如果沒有 default 子句,select 將阻塞,直到某個通信可以運行;Go 不會重新對 channel 或值進行求值
package main

import (
	"fmt"
	"time"
)

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 TestFuncyunsuanfuSelect1(){

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

func TestFuncyunsuanfuSelect()  {
	var c1, c2, c3 chan int   //一個可以發送 int 類型數據的 channel 一般寫爲 chan int
	var i1, i2 int
	select {
	case i1 = <-c1:
		fmt.Printf("received ", i1, " from c1\n")
	case c2 <- i2:
		fmt.Printf("sent ", i2, " to c2\n")
	case i3, ok := (<-c3):  // same as: i3, ok := <-c3
		if ok {
			fmt.Printf("received ", i3, " from c3\n")
		} else {
			fmt.Printf("c3 is closed\n")
		}
	default:
		fmt.Printf("no communication\n")
	}
}
func main(){
	TestFuncyunsuanfuSelect1()
	TestFuncyunsuanfuSelect()
}

Recvice 10
channel
Receive 10
Recvice 10
channel
Receive 10
Recvice 10
channel
Receive 10
Receive 10
Receive 10
Receive 10
Recvice 10
channel
no communication

Process finished with exit code 0

GO語言的循環語句

Go 語言的 For 循環有 3 種形式,只有其中的一種使用分號。
和 C 語言的 for 一樣:
for init; condition; post { } —》 和 C 的 for(i=0;i<condition;i++) 一樣:
for condition { } —》 C中的while()
for { } ----》 C中的for(;😉
init: 一般爲賦值表達式,給控制變量賦初值;
condition: 關係表達式或邏輯表達式,循環控制條件;
post: 一般爲賦值表達式,給控制變量增量或減量。

for語句執行過程如下:
1、先對錶達式 賦初值;
2、判別賦值表達式 init 是否滿足給定條件,若其值爲真,滿足循環條件,則執行循環體內語句,然後執行 post,進入第二次循環,再判別 condition;否則判斷 condition 的值爲假,不滿足條件,就終止for循環,執行循環體外語句。

for 循環的 range 格式可以對 slice、map、數組、字符串等進行迭代循環。格式如下:
for key, value := range oldMap {
newMap[key] = value
}

func TestFunckongzhiyuju(){
	/*第一種類似C中的for(i=0;i<20;i++)*/
	/*
	var sum int = 0
	var i int = 0
	for i = 0; i <= 10; i++ {
		sum += i
	}
	*/
	sum := 0
	for i := 0; i <= 10; i++ {
		sum += i
	}
	fmt.Println(sum)

	/*第二種類似於C中的while()*/
	sum = 1
	for ; sum <= 10; {
		sum += sum
	}
	fmt.Println(sum)

	// 這樣寫也可以,更像 While 語句形式
	for sum <= 10{
		sum += sum
	}
	fmt.Println(sum)
	/*第三種類似於C中的for()*/
	m := 0
	for {
		m++ // 無限循環下去
	}
    /*分片處理*/
	strings := []string{"google", "runoob"}
	for i, s := range strings {
		fmt.Println(i, s)
	}

	numbers := [6]int{1, 2, 3, 5}
	for i,x:= range numbers {
		fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
	}

}

func main(){
	//TestFuncyunsuanfuSelect1()
	//TestFuncyunsuanfuSelect()
	TestFunckongzhiyuju()
}
55
16
16
0 google
1 runoob
第 0 位 x 的值 = 11 位 x 的值 = 22 位 x 的值 = 33 位 x 的值 = 54 位 x 的值 = 05 位 x 的值 = 0

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