欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Golang中的流程控制有哪些及怎么實現(xiàn)

這篇文章主要講解了“Golang中的流程控制有哪些及怎么實現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Golang中的流程控制有哪些及怎么實現(xiàn)”吧!

10年積累的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有蕉嶺免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

Go語言基礎(chǔ)之流程控制主要包括以下內(nèi)容:

  • 條件語句if

  • 條件語句switch

  • 條件語句select

  • 循環(huán)語句for

  • 循環(huán)語句range

  • 循環(huán)控制Goto、Break、Continue

1. 條件語句if

Go語言中if條件判斷的格式如下:

if 表達式1 {
    分支1
} else if 表達式2 {
    分支2
} else{
    分支3
}

前端的同學(xué)想必對js相對熟悉,相對于js來說,go表達式去掉了括號(),但同時給了一些約束,與if匹配的左括號{必須與if和表達式放在同一行,{放在其他位置會觸發(fā)編譯錯誤。 同理,與else匹配的{也必須與else寫在同一行,else也必須與上一個ifelse if右邊的大括號在同一行。

x := 0

// if x > 10        // Error: missing condition in if statement
// {
// }

if n := "abc"; x > 0 {     // 初始化語句未必就是定義變量, 如 println("init") 也是可以的。
    println(n[2])
} else if x < 0 {    // 注意 else if 和 else 左大括號位置。
    println(n[1])
} else {
    println(n[0])
}



 *不支持三元操作符(三目運算符) "a > b ? a : b"。
 
package main

import "fmt"

func main() {
   /* 定義局部變量 */
   var a int = 10
   /* 使用 if 語句判斷布爾表達式 */
   if a < 20 {
       /* 如果條件為 true 則執(zhí)行以下語句 */
       fmt.Printf("a 小于 20\n" )
   }
   fmt.Printf("a 的值為 : %d\n", a)
}


以上代碼執(zhí)行結(jié)果為:
a 小于 20
a 的值為 : 10

2. 條件語句switch

switch 語句用于基于不同條件執(zhí)行不同動作,每一個 case 分支都是唯一的,從上直下逐一測試,直到匹配為止。 Golang switch 分支表達式可以是任意類型,不限于常量??墒÷?break,默認自動終止。

package main

import "fmt"

func main() {
   /* 定義局部變量 */
   var grade string = "B"
   var marks int = 90

   switch marks {
      case 90: grade = "A"
      case 80: grade = "B"
      case 50,60,70 : grade = "C"
      default: grade = "D"  
   }

   switch {
      case grade == "A" :
         fmt.Printf("優(yōu)秀!\n" )     
      case grade == "B", grade == "C" :
         fmt.Printf("良好\n" )      
      case grade == "D" :
         fmt.Printf("及格\n" )      
      case grade == "F":
         fmt.Printf("不及格\n" )
      default:
         fmt.Printf("差\n" )
   }
   fmt.Printf("你的等級是 %s\n", grade )
}



以上代碼執(zhí)行結(jié)果為:
優(yōu)秀!
你的等級是 A

3. 條件語句select

select 語句類似于 switch 語句,但是select會隨機執(zhí)行一個可運行的case。如果沒有case可運行,它將阻塞,直到有case可運行。

select 是Go中的一個控制結(jié)構(gòu),類似于用于通信的switch語句。每個case必須是一個通信操作,要么是發(fā)送要么是接收。 select 隨機執(zhí)行一個可運行的case。如果沒有case可運行,它將阻塞,直到有case可運行。一個默認的子句應(yīng)該總是可運行的。

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

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

import "fmt"

func main() {
   var c1, c2, c3 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")
   }    
}



以上代碼執(zhí)行結(jié)果為:

 no communication

select可以監(jiān)聽channel的數(shù)據(jù)流動

select的用法與switch語法非常類似,由select開始的一個新的選擇塊,每個選擇條件由case語句來描述

與switch語句可以選擇任何使用相等比較的條件相比,select有比較多的限制,其中最大的一條限制就是每個case語句里必須是一個IO操作

 select { //不停的在這里檢測
    case <-chanl : //檢測有沒有數(shù)據(jù)可以讀
    //如果chanl成功讀取到數(shù)據(jù),則進行該case處理語句
    case chan2 <- 1 : //檢測有沒有可以寫
    //如果成功向chan2寫入數(shù)據(jù),則進行該case處理語句


    //假如沒有default,那么在以上兩個條件都不成立的情況下,就會在此阻塞//一般default會不寫在里面,select中的default子句總是可運行的,因為會很消耗CPU資源
    default:
    //如果以上都沒有符合條件,那么則進行default處理流程
    }

在一個select語句中,Go會按順序從頭到尾評估每一個發(fā)送和接收的語句。

如果其中的任意一個語句可以繼續(xù)執(zhí)行(即沒有被阻塞),那么就從那些可以執(zhí)行的語句中任意選擇一條來使用。 如果沒有任意一條語句可以執(zhí)行(即所有的通道都被阻塞),那么有兩種可能的情況: ①如果給出了default語句,那么就會執(zhí)行default的流程,同時程序的執(zhí)行會從select語句后的語句中恢復(fù)。 ②如果沒有default語句,那么select語句將被阻塞,直到至少有一個case可以進行下去。

典型用法-超時判斷

//比如在下面的場景中,使用全局resChan來接受response,如果時間超過3S,resChan中還沒有數(shù)據(jù)返回,則第二條case將執(zhí)行
var resChan = make(chan int)
// do request
func test() {
   select {
   case data := <-resChan:
       doData(data)
   case <-time.After(time.Second * 3):
       fmt.Println("request time out")
   }
}

func doData(data int) {
   //...
}

4. 循環(huán)語句for

和if一樣,相對于js,go語言的for循環(huán)也去掉了括號(),其他并沒有太大的區(qū)別。

package main

import "fmt"

func main() {

   var b int = 15
   var a int

   numbers := [6]int{1, 2, 3, 5}

   /* for 循環(huán) */
   for a := 0; a < 10; a++ {
      fmt.Printf("a 的值為: %d\n", a)
   }

   for a < b {
      a++
      fmt.Printf("a 的值為: %d\n", a)
      }

   for i,x:= range numbers {
      fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
   }   
}


以上實例運行輸出結(jié)果為:

    a 的值為: 0
    a 的值為: 1
    a 的值為: 2
    a 的值為: 3
    a 的值為: 4
    a 的值為: 5
    a 的值為: 6
    a 的值為: 7
    a 的值為: 8
    a 的值為: 9
    a 的值為: 1
    a 的值為: 2
    a 的值為: 3
    a 的值為: 4
    a 的值為: 5
    a 的值為: 6
    a 的值為: 7
    a 的值為: 8
    a 的值為: 9
    a 的值為: 10
    a 的值為: 11
    a 的值為: 12
    a 的值為: 13
    a 的值為: 14
    a 的值為: 15
    第 0 位 x 的值 = 1
    第 1 位 x 的值 = 2
    第 2 位 x 的值 = 3
    第 3 位 x 的值 = 5
    第 4 位 x 的值 = 0
    第 5 位 x 的值 = 0

5. 循環(huán)語句range

Golang range類似迭代器操作,返回 (索引, 值) 或 (鍵, 值)。

for 循環(huán)的 range 格式可以對 slice、map、數(shù)組、字符串等進行迭代循環(huán)。格式如下:

for key, value := range oldMap {
    newMap[key] = value
}

登錄后復(fù)制

package main

func main() {
    s := "abc"
    // 忽略 2nd value,支持 string/array/slice/map。
    for i := range s {
        println(s[i])
    }
    // 忽略 index。
    for _, c := range s {
        println(c)
    }
    // 忽略全部返回值,僅迭代。
    for range s {

    }

    m := map[string]int{"a": 1, "b": 2}
    // 返回 (key, value)。
    for k, v := range m {
        println(k, v)
    }
}

輸出結(jié)果:

    97
    98
    99
    97
    98
    99
    a 1
    b 2

for 和 for range有什么區(qū)別?

主要是使用場景不同

for可以遍歷array和slice,遍歷key為整型遞增的map,遍歷string

for range可以完成所有for可以做的事情,卻能做到for不能做的,包括遍歷key為string類型的map并同時獲取key和value,遍歷channel

6. 循環(huán)控制Goto、Break、Continue

循環(huán)控制語句

循環(huán)控制語句可以控制循環(huán)體內(nèi)語句的執(zhí)行過程。

GO 語言支持以下幾種循環(huán)控制語句:

Goto、Break、Continue

    1.三個語句都可以配合標簽(label)使用
    2.標簽名區(qū)分大小寫,定以后若不使用會造成編譯錯誤
    3.continue、break配合標簽(label)可用于多層循環(huán)跳出
    4.goto是調(diào)整執(zhí)行位置,與continue、break配合標簽(label)的結(jié)果并不相同

break(跳出循環(huán)): continue(繼續(xù)下次循環(huán))break語句可以結(jié)束for、switchselect的代碼塊。break語句還可以在語句后面添加標簽,表示退出某個標簽對應(yīng)的代碼塊,標簽要求必須定義在對應(yīng)的for、switchselect的代碼塊上。

continue(繼續(xù)下次循環(huán))continue語句可以結(jié)束當(dāng)前循環(huán),開始下一次的循環(huán)迭代過程,僅限在for循環(huán)內(nèi)使用。在 continue語句后添加標簽時,表示開始標簽對應(yīng)的循環(huán)

goto語句通過標簽進行代碼間的無條件跳轉(zhuǎn)。goto語句可以在快速跳出循環(huán)、避免重復(fù)退出上有一定的幫助。Go語言中使用goto語句能簡化一些代碼的實現(xiàn)過程。 例如雙層嵌套的for循環(huán)要退出時:

func gotoDemo1() {
	var breakFlag bool
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				// 設(shè)置退出標簽
				breakFlag = true
				break
			}
			fmt.Printf("%v-%v\n", i, j)
		}
		// 外層for循環(huán)判斷
		if breakFlag {
			break
		}
	}
}

使用goto語句能簡化代碼:

func gotoDemo2() {
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				// 設(shè)置退出標簽
				goto breakTag
			}
			fmt.Printf("%v-%v\n", i, j)
		}
	}
	return
	// 標簽
breakTag:
	fmt.Println("結(jié)束for循環(huán)")
}

感謝各位的閱讀,以上就是“Golang中的流程控制有哪些及怎么實現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Golang中的流程控制有哪些及怎么實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

本文標題:Golang中的流程控制有哪些及怎么實現(xiàn)
文章起源:http://chinadenli.net/article20/jsisjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、微信小程序Google、響應(yīng)式網(wǎng)站、靜態(tài)網(wǎng)站、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
东京热男人的天堂社区| 不卡在线播放一区二区三区| 人妻久久这里只有精品| 日本人妻精品有码字幕| 中文字幕人妻日本一区二区| 亚洲国产一级片在线观看| 日韩偷拍精品一区二区三区| 亚洲午夜福利视频在线| 精品老司机视频在线观看| 欧美午夜一级特黄大片| 国产精品流白浆无遮挡| 精品欧美日韩一二三区| 香蕉网尹人综合在线观看| 我的性感妹妹在线观看| 日本道播放一区二区三区| 亚洲视频一级二级三级| 夫妻性生活真人动作视频 | 欧美日韩一区二区三区色拉拉| 亚洲一区二区三区三州| 日本国产欧美精品视频| 亚洲视频一级二级三级| 日系韩系还是欧美久久| 国产精品欧美激情在线观看| 国产二级一级内射视频播放| 加勒比人妻精品一区二区| 免费人妻精品一区二区三区久久久| 国产一二三区不卡视频| 免费特黄欧美亚洲黄片| 亚洲国产成人久久99精品 | 欧美一区日韩一区日韩一区| 亚洲男人的天堂久久a| 中字幕一区二区三区久久蜜桃| 国产激情国产精品久久源| 少妇肥臀一区二区三区| 欧美又大又黄刺激视频| 国产一级一片内射视频在线| 99久久婷婷国产亚洲综合精品| 欧美熟妇喷浆一区二区| 欧美尤物在线观看西比尔| 五月婷婷缴情七月丁香| 午夜精品久久久99热连载|