這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Go語言的流程式控制制主要分為三大類:
1.聽條件判斷2.聽迴圈控制3.聽無條件跳轉
條件判斷
Go語言的條件判斷由if ... else if ... else 語句實現,條件運算式值必須是布爾類型,可省略圓括弧,但是花括弧不能省略且左花括弧不能另起一行,比如:
if聽7%2聽==聽0聽{聽聽聽聽fmt.Println("7聽is聽even")}聽else聽{聽聽聽聽fmt.Println("7聽is聽odd")}聽聽聽聽if聽8%4聽==聽0聽{聽聽聽//可以沒有else只有if語句聽聽聽聽fmt.Println("8聽is聽divisible聽by聽4")}
Go語言比較特別的是在條件判讀語句中支援初始化語句,允許定義局部變數,但是這個變數的範圍僅限於該條件邏輯塊內,比如:
if聽num聽:=聽9;聽num聽<聽0聽{聽聽聽聽fmt.Println(num,聽"is聽negative")}聽else聽if聽num聽<聽10聽{聽聽聽聽fmt.Println(num,聽"has聽1聽digit")}聽else聽{聽聽聽聽fmt.Println(num,聽"has聽multiple聽digits")}
最典型的應用就是字典的尋找:
if聽v,聽ok聽:=聽map1[key1];聽ok{聽聽聽聽...}
最佳化建議:
對於那些過於複雜的組合條件判斷,建議獨立出來封裝成函數,將流程式控制制和實現細節分離,使你的代碼更加模組化,提高可讀性.
有些時需要寫很多的if-else實現一些複雜的邏輯處理,這時代碼看上去就很羅嗦很冗長,而且也不易於以後的維護,用switch...case來很好的解決這個問題.
switch...case
switch與if類似,也用於選擇執行,執行的過程從上至下順序匹配各個case,基本用法如下:
switch聽sExpr聽{聽聽聽聽聽聽聽聽case聽expr1:聽聽聽聽聽聽聽聽some聽instructions聽聽聽聽聽聽聽聽case聽expr2:聽聽聽聽聽聽聽聽some聽other聽instructions聽聽聽聽case聽expr3:聽聽聽聽聽聽聽聽some聽other聽instructions聽聽聽聽default:聽聽聽聽聽聽聽聽other聽code}
switch中的運算式可以不是常量或字串,甚至可以沒有運算式,若沒有運算式則匹配true, 如同if-else if-else,與 其它程式設計語言的switch用法基本相同,不同的是在每個case中隱藏了break,不過也可以顯示加入break。 當case匹配成功後,處理當前case的處理邏輯,正常情況下,處理完成後就跳出整個switch,但這不是絕對的, 可以使用fallthrough強迫程式執行後面的case; 如果沒有任何case匹配成功,則執行default邏輯,比如:
免寫break:
{聽聽聽聽i聽:=聽2聽聽聽聽switch聽i聽{聽聽聽聽聽聽聽聽聽聽聽聽聽聽//將i聽與case條件匹配聽聽聽聽聽聽聽聽case聽1:聽聽聽聽聽聽聽聽聽聽聽聽fmt.Println("one")聽聽//break沒有實際意義,直接跳出switch聽聽聽聽聽聽聽聽case聽2:聽聽聽聽聽聽聽聽聽聽聽聽fmt.Println("two")聽聽聽聽聽聽聽聽聽聽case聽3:聽聽聽聽聽聽聽聽聽聽聽聽fmt.Println("three")聽聽聽聽}}
多運算式判斷:
{聽聽聽聽聽聽聽聽switch聽time.Now().Weekday()聽{聽聽聽聽聽聽聽聽case聽time.Saturday,聽time.Sunday:聽//在同一個case中可以寫多個運算式,它們之間是邏輯或的關係聽聽聽聽聽聽聽聽聽聽聽聽fmt.Println("it's聽the聽weekend")聽聽聽聽聽聽聽聽default:聽聽聽聽聽聽聽聽聽聽聽聽fmt.Println("it's聽a聽weekday")聽聽聽聽}}
無運算式:
{聽聽聽聽t聽:=聽time.Now()聽聽聽聽聽聽聽switch聽{聽聽聽聽聽聽聽聽聽聽聽聽//沒有運算式,相當於if-else聽聽聽聽聽聽聽聽case聽t.Hour()聽<聽12:聽聽聽聽聽聽聽聽聽聽聽聽fmt.Println("it's聽before聽noon")聽聽聽聽聽聽聽聽聽聽聽聽default:聽聽聽聽聽聽聽聽聽聽聽聽fmt.Println("it's聽after聽noon")聽聽聽聽}}
fallthrough:
{聽聽聽聽i聽:=聽2聽聽聽聽switch聽i聽{聽聽聽聽聽聽聽聽聽聽聽聽case聽1:聽聽聽聽聽聽聽聽聽聽聽聽fmt.Println("one")聽聽聽聽聽聽聽聽聽聽聽聽case聽2:聽聽聽聽聽聽聽聽聽聽聽聽fmt.Println("two")聽聽聽聽聽聽聽聽聽聽聽聽fallthrough聽聽聽聽//使用fallthrough強迫程式執行後面的case聽聽聽聽聽聽聽聽case聽3:聽聽聽聽聽聽聽聽聽聽聽聽fmt.Println("three")聽聽聽聽}}
迴圈控制
for是Go語言中僅有的一種迴圈語句,下面是常見的三種用法:
for聽j聽:=聽7;聽j聽<=聽9;聽j++聽{聽//典型的用法聽initial/condition/after聽聽聽聽fmt.Println(j)}i聽:=聽1for聽i聽<=聽3聽{聽聽聽聽聽聽聽聽聽聽聽聽//類似while(i聽<=聽3){}聽或for聽;聽i<=3聽;;{}聽聽聽聽fmt.Println(i)聽聽聽聽i聽=聽i聽+聽1}for聽{聽聽聽聽//類似while(true){}聽或for聽true聽{}聽聽聽聽fmt.Println("loop")聽聽聽聽聽聽聽...聽聽聽聽聽聽聽聽聽break}
PS:初始化語句只會被執行一次,並且初始設定式支援函數調用或定義局部變數
在日常開發中for經常與range搭配,for...range被用來遍曆字串、數組、切片、字典和通道等,返回索引和索引值資料,比如:
{聽聽聽聽for聽i,聽c聽:=聽range聽"go"聽{聽聽聽聽聽聽聽聽聽聽聽聽//range聽string聽聽聽聽聽聽聽聽fmt.Println(i,聽c)聽聽聽聽}聽聽聽聽nums聽:=聽[]int{2,聽3,聽4}聽聽聽聽聽聽聽聽for聽i,聽num聽:=聽range聽nums聽{聽聽聽聽聽聽聽聽聽聽//range聽array/slice聽聽聽聽聽聽聽聽fmt.Println(i,聽":",聽num)聽聽聽聽}聽聽聽聽kvs聽:=聽map[string]string{"a":聽"apple",聽"b":聽"banana"}聽聽聽聽聽聽聽聽for聽k,聽v聽:=聽range聽kvs聽{聽聽聽聽聽聽聽聽聽//range聽map聽聽聽聽聽聽聽聽fmt.Printf("%s聽->聽%s\n",聽k,聽v)聽聽聽聽}聽聽聽聽chs聽:=聽make(chan聽int,10)聽聽聽聽//range聽channel聽聽聽聽chs聽<-聽1聽聽聽聽chs聽<-聽2聽聽聽聽close(chs)聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽for聽v聽:=聽range聽chs聽{聽聽聽聽聽聽聽聽fmt.Println(v)聽聽聽聽}}
簡單歸納如下:
| data type |
first value |
second value |
| string |
index |
s[index] |
| array/slice |
index |
v[index] |
| map |
key |
value |
| channel |
element |
|
無條件跳轉
Go語言有三種跳轉類型,分別是 continue, break, goto
continue:僅用於for迴圈內部聽,終止本次迴圈,立即進入下一輪迴圈break:用於for迴圈,聽switch,select語句,終止整個語句塊的執行goto:定點跳轉,但不能跳轉到其他函數或內層代碼塊內
看下面的例子:
func聽over(){聽聽聽聽over:聽聽聽//label聽over聽defined聽and聽not聽used聽聽聽聽println("call聽over")}func聽main(){聽聽聽聽rand.Seed(time.Now().UnixNano())聽聽聽聽聽聽聽聽for聽{聽聽聽聽聽聽聽聽loop:聽聽聽聽聽聽聽聽x聽:=聽rand.Intn(100)聽聽聽聽聽//擷取一個100以內的隨機數聽聽聽聽聽聽聽聽if聽x聽%聽2聽==聽0{聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽continue聽聽聽聽聽聽聽聽//終止本次迴圈,立即進入下一輪迴圈聽聽聽聽聽聽聽聽}聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if聽x聽>聽50{聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽break聽聽聽聽聽聽聽聽聽聽聽//終止整個語句塊的執行聽聽聽聽聽聽聽聽}聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽println(x)聽聽聽聽}聽聽聽聽聽聽聽聽goto聽over聽聽聽聽聽聽聽//label聽over聽not聽defined聽聽聽聽goto聽loop聽聽聽聽聽聽聽//goto聽loop聽jumps聽into聽block聽starting}
goto 的習慣用法:
{聽聽聽聽f,聽err聽:=聽os.Open("/tmp/dat")聽聽聽聽聽聽聽聽if聽err聽!=聽nil{聽聽聽聽聽聽聽聽....聽聽聽聽聽聽聽聽聽goto聽exit聽聽聽聽}聽聽聽聽...聽聽聽聽n1,聽err聽:=聽f.Read(b1)聽聽聽聽if聽err聽!=聽nil{聽聽聽聽聽聽聽聽聽goto聽end聽聽聽聽}聽聽聽聽...end:聽聽聽聽聽聽聽聽println("clear聽resource聽and聽exit")聽聽聽聽f.close()exit:聽聽聽聽聽聽聽聽return}
借鑒: 雨痕<GO學習筆記>
討論學習: 675020908
本文出自 “博學於文,約之於禮” 部落格,轉載請與作者聯絡!