最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Go語言中Channel的各種用法

 更新時(shí)間:2022年11月24日 14:15:03   作者:掘金小逆  
這篇文章主要帶大家一起來學(xué)習(xí)一下Go語言中的if語句,也就是大家口中的判斷語句。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下

Go語言基礎(chǔ)四

今天我們要來學(xué)習(xí)if語句,也就是大家口中的判斷語句,我們首先來看一下if語句的定義

if定義

條件語句需要開發(fā)者通過指定一個(gè)或多個(gè)條件,并通過測(cè)試條件是否為 true 來決定是否執(zhí)行指定語句,并在條件為 false 的情況在執(zhí)行另外的語句。相信讀者看到這兒,也是云里霧里的感覺,我們?cè)趺磥肀硎?strong>true和false呢?

單層if語法格式

  • 可省略條件表達(dá)式括號(hào)。
  • 持初始化語句,可定義代碼塊局部變量。 
  • 代碼塊左 括號(hào)必須在條件表達(dá)式尾部。

    if 布爾表達(dá)式 {
    /* 在布爾表達(dá)式為 true 時(shí)執(zhí)行 */
    }  

這里要為讀者介紹的是,如果if后面的條件語句程序給出的數(shù)能夠滿足,則我們表示為true;如果不能,則返回false

package main
?
import "fmt"
?
func main() {
   a := 3
   if a > 2 {
      fmt.Println("true")
   } else {
      fmt.Println("false")
   }
}

如代碼塊所示,這里我們定義了一個(gè)變量a的值為3,接下來是一個(gè)if判斷,如果該數(shù)值>2,則調(diào)用函數(shù)打印輸出true;否則返回false。換句話說,我們這里即是對(duì)a變量的一個(gè)判斷,至于調(diào)用函數(shù)打印輸出的內(nèi)容,由讀者自行決定

語法警告

在Go語法中,不支持三元操作符(三目運(yùn)算符) a > b ? a : b,如果讀者對(duì)三元運(yùn)算符較感興趣,可以移步至java了解三元運(yùn)算符(其本質(zhì)上也是一種if判斷形式

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

上方是關(guān)于if判斷的一個(gè)小練習(xí),讀者自行體會(huì)即可;if 在布爾表達(dá)式為 true 時(shí),其后緊跟的語句塊執(zhí)行,如果為 false 則執(zhí)行 else 語句塊。

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

Go語言中,if語句也支持嵌套處理,即可以實(shí)現(xiàn)多重if判斷以達(dá)到程序想要的結(jié)果

多層if語法格式

if 布爾表達(dá)式 1 {
   /* 在布爾表達(dá)式 1 為 true 時(shí)執(zhí)行 */
   if 布爾表達(dá)式 2 {
      /* 在布爾表達(dá)式 2 為 true 時(shí)執(zhí)行 */
   }

package main
?
import "fmt"
?
func main() {
   /* 定義局部變量 */
   var a int = 100
   var b int = 200
   /* 判斷條件 */
   if a == 100 {
       /* if 條件語句為 true 執(zhí)行 */
       if b == 200 {
          /* if 條件語句為 true 執(zhí)行 */
          fmt.Printf("a 的值為 100 , b 的值為 200\n" )
       }
   }
   fmt.Printf("a 值為 : %d\n", a )
   fmt.Printf("b 值為 : %d\n", b )
}     

如上圖所示,我們?cè)?code>if語句里面嵌套了另一個(gè)if語句,即是在默認(rèn)a == 100的情況下寫出對(duì)變量b的值的判斷,最終調(diào)用函數(shù)打印輸出a和b的值

有時(shí)候我們多個(gè)變量匹配同一個(gè)值,就會(huì)用到Switch語句

Switch定義

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

Switch語法格式

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}
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("你的等級(jí)是 %s\n", grade )
}    

由上方代碼塊可知,我們定義了兩個(gè)局部變量grademarks,對(duì)marks進(jìn)行Switch判斷操作,當(dāng)case滿足不同的值的時(shí)候,調(diào)用函數(shù)打印輸出的值也不一樣

Type Switch

switch 語句還可以被用于 type-switch 來判斷某個(gè) interface 變量中實(shí)際存儲(chǔ)的變量類型

Type Switch語法格式

switch x.(type){
    case type:
       statement(s)      
    case type:
       statement(s)
    /* 你可以定義任意個(gè)數(shù)的case */
    default: /* 可選 */
       statement(s)
} 

由于Type Switch用途不是特別的多,作者在這里不作詳細(xì)描述,讀者可以去官網(wǎng)自行查詢相關(guān)文檔進(jìn)行學(xué)習(xí)

Select定義

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

Select語法格式

select {
    case communication clause  :
       statement(s);      
    case communication clause  :
       statement(s);
    /* 你可以定義任意數(shù)量的 case */
    default : /* 可選 */
       statement(s);
} 

Select語句注意事項(xiàng)

  • 每個(gè)case必須是一個(gè)通信
  • 所有channel表達(dá)式都會(huì)被求值
  • 所有被發(fā)送的表達(dá)式都會(huì)被求值
  • 如果任意某個(gè)通信可以進(jìn)行,它就執(zhí)行;其他被忽略
  • 如果有多個(gè)case都可以運(yùn)行,Select會(huì)隨機(jī)公平地選出一個(gè)執(zhí)行。其他不會(huì)執(zhí)行。
  • 如果有default子句,則執(zhí)行該語句。
  • 如果沒有default字句,select阻塞,直到某個(gè)通信可以運(yùn)行;Go不會(huì)重新對(duì)channel值重新進(jìn)行求值。
package main
?
import "fmt"
?
func main() {
   var c1, c2, c3 chan int //通道機(jī)制
   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")
   }
}

根據(jù)上方代碼所示,定義了c1、c2、c3三個(gè)變量,并且使用chan通道。關(guān)于寫法的解釋:一個(gè)可以發(fā)送 int 類型數(shù)據(jù)的 channel 一般寫為 chan int,根據(jù)上方的語法規(guī)則:如果有default子句,則執(zhí)行該語句,故上方代碼塊執(zhí)行代碼為:no communication

Select用法補(bǔ)充

  • 我們可以使用select來監(jiān)聽channel的數(shù)據(jù)流動(dòng)
  • select的用法與switch語法非常類似,由select開始的一個(gè)新的選擇塊,每個(gè)選擇條件由case語句來描述
  • switch語句可以選擇任何使用相等比較的條件相比,select由比較多的限制,其中最大的一條限制就是每個(gè)case語句里必須是一個(gè)IO操作
  • 如果每個(gè) case都未讀取到,則Go語言會(huì)自動(dòng)讀取default語句所描述的東西,在正常情況下,每個(gè)select程序都會(huì)有一個(gè)輸出語句
  • 如果既沒有case語句滿足,也不存在default語句,則程序進(jìn)入阻塞狀態(tài),系統(tǒng)會(huì)發(fā)出警告,直至疏通

超時(shí)判斷

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) {
    //...
}

根據(jù)上方代碼塊可知,我們定義了一個(gè)select語句,在第一條case里面,我們將resChan傳給data,如果在傳輸?shù)倪^程中時(shí)長(zhǎng)超過3s,則會(huì)執(zhí)行第二條case語句

退出

var shouldQuit=make(chan struct{})
fun main(){
    {
        //loop
    }
    //...out of the loop
    select {
        case <-c.shouldQuit:
            cleanUp()
            return
        default:
        }
    //...
}
?
//在另外一個(gè)協(xié)程中,如果運(yùn)行遇到非法操作或不可處理的錯(cuò)誤,就向shouldQuit發(fā)送數(shù)據(jù)通知程序停止運(yùn)行
close(shouldQuit)

我們定義一個(gè)var類型的shouldQuit變量用于結(jié)構(gòu)體的通道,首先我們開啟一個(gè)select循環(huán),在case里面調(diào)用通道方法,并且返回所對(duì)應(yīng)的值;如果不滿足,則返回default的值。同時(shí)我們?cè)?strong>另外一個(gè)協(xié)程中,如果我們遇到了非法操作或不可處理的錯(cuò)誤,就向shouldQuit發(fā)送數(shù)據(jù)通知程序停止運(yùn)行

判斷Channel狀態(tài)

ch := make (chan int, 5)
//...
data:=0
select {
case ch <- data:
default:
} 

有時(shí)候我們不喜歡緩存變慢,這樣不利于我們?nèi)メ尫刨Y源,因此我們可以用一個(gè)簡(jiǎn)單的判斷方法去進(jìn)行判斷:首先我們開啟一個(gè)int類型,長(zhǎng)度為5的通道,在通道里面我們開啟一個(gè)select循環(huán),如果data通道的值能被ch所接收,則執(zhí)行該條語句,否則我們可對(duì)default語句進(jìn)行拋棄data等處理操作

到此這篇關(guān)于淺析Go語言中Channel的各種用法的文章就介紹到這了,更多相關(guān)Go語言Channel用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言常見哈希函數(shù)的使用

    Go語言常見哈希函數(shù)的使用

    哈希表(Hash table,也叫散列表),是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過把關(guān)鍵碼值映射到表中一個(gè)位置來訪問記錄,以加快查找的速度。具體的介紹網(wǎng)上有很詳細(xì)的描述,如閑聊哈希表 ,這里就不再累述了;
    2015-03-03
  • Go語言實(shí)現(xiàn)UDP版聊天小工具的示例詳解

    Go語言實(shí)現(xiàn)UDP版聊天小工具的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語言實(shí)現(xiàn)聊天小工具(UDP版),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • go語言使用Chromedp實(shí)現(xiàn)二維碼登陸教程示例源碼

    go語言使用Chromedp實(shí)現(xiàn)二維碼登陸教程示例源碼

    這篇文章主要為大家介紹了go語言使用Chromedp實(shí)現(xiàn)二維碼登陸示例源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Go模板template用法詳解

    Go模板template用法詳解

    這篇文章主要介紹了Go標(biāo)準(zhǔn)庫(kù)template模板用法詳解;包括GO模板注釋,作用域,語法,函數(shù)等知識(shí),需要的朋友可以參考下
    2022-04-04
  • Golang協(xié)程池gopool設(shè)計(jì)與實(shí)現(xiàn)

    Golang協(xié)程池gopool設(shè)計(jì)與實(shí)現(xiàn)

    本文主要介紹了Golang協(xié)程池gopool設(shè)計(jì)與實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Golang中的深拷貝與淺拷貝使用

    Golang中的深拷貝與淺拷貝使用

    本文主要介紹了Golang中的深拷貝與淺拷貝使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • go責(zé)任鏈行為型設(shè)計(jì)模式Chain?Of?Responsibility

    go責(zé)任鏈行為型設(shè)計(jì)模式Chain?Of?Responsibility

    這篇文章主要為大家介紹了go行為型設(shè)計(jì)模式之責(zé)任鏈Chain?Of?Responsibility使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 解決Golang time.Parse和time.Format的時(shí)區(qū)問題

    解決Golang time.Parse和time.Format的時(shí)區(qū)問題

    這篇文章主要介紹了解決Golang time.Parse和time.Format的時(shí)區(qū)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 使用Go+GoQuery庫(kù)實(shí)現(xiàn)頭條新聞采集

    使用Go+GoQuery庫(kù)實(shí)現(xiàn)頭條新聞采集

    在本文中,我們將介紹如何使用Go語言和GoQuery庫(kù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的爬蟲程序,用于抓取頭條新聞的網(wǎng)頁(yè)內(nèi)容,我們還將使用爬蟲代理服務(wù),提高爬蟲程序的性能和安全性,我們將使用多線程技術(shù),提高采集效率,最后,我們將展示爬蟲程序的運(yùn)行結(jié)果和代碼,需要的朋友可以參考下
    2023-10-10
  • 使用golang-unsafe包的注意事項(xiàng)及說明

    使用golang-unsafe包的注意事項(xiàng)及說明

    這篇文章主要介紹了使用golang-unsafe包的注意事項(xiàng)及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論

法库县| 信阳市| 静海县| 张家口市| 彭阳县| 临沧市| 桐梓县| 绥滨县| 施甸县| 焦作市| 大竹县| 临夏县| 上高县| 冷水江市| 芮城县| 屯昌县| 合阳县| 东丰县| 长宁区| 鄄城县| 山东省| 海林市| 临汾市| 石林| 周口市| 江西省| 济源市| 平阳县| 东丽区| 扎囊县| 偃师市| 黄大仙区| 河池市| 武汉市| 衡水市| 仪征市| 临泽县| 栾川县| 东城区| 廉江市| 天台县|