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

掌握Golang中的select語句實現(xiàn)并發(fā)編程

 更新時間:2023年04月18日 10:02:58   作者:西直門三太子  
Golang中的select語句用于在多個通道間選擇可讀或可寫的操作,并阻塞等待其中一個通道進行操作??梢杂糜趯崿F(xiàn)超時控制、取消和中斷操作等。同時,select語句支持default分支,用于在沒有任何通道可操作時執(zhí)行默認操作

序文

select 是用來配合channel使用的

空select

  • 沒有內(nèi)容的select 會阻塞
  • 沒有內(nèi)容是指,沒有case,也沒有default
  • 如果沒有其它的任務指執(zhí)行,將會觸發(fā)死鎖
package main
import (
    "fmt"
    "time"
)
/**
* 沒有內(nèi)容的select 會阻塞
* 沒有內(nèi)容是指,沒有case,也沒有default
* 如果沒有其它的任務指執(zhí)行,將會觸發(fā)死鎖
*/
func main() {
    go func() {
        time.Sleep(2 * time.Second)
        fmt.Println("沒有內(nèi)容的select 會阻塞")
    }()
    select {}
}

只有default的select

只有default的select 和串行化沒有區(qū)別

package main
import "fmt"
/**
 只有default的select 和串行化沒有區(qū)別
 */
func main() {
	go func() {
		fmt.Println("quick")
	}()
	select {
	default:
		fmt.Println("end")
	}
}

帶 case 的 select

有case,有 default

  • 如果能匹配到case 就 執(zhí)行 case
  • 匹配不到case,就執(zhí)行default
  • 有 default,就代表了不會阻塞
package main
import (
	"fmt"
)
func main() {
	ch1 := make(chan int, 2)
	ch2 := make(chan int, 2)
	select {
	case v1 := <-ch1:
		fmt.Println(v1)
	case v2 := <-ch2:
		fmt.Println(v2)
	default:
		fmt.Println(22)
	}
}

package main
import (
	"fmt"
	"time"
)
func main() {
	ch1 := make(chan int, 2)
	ch2 := make(chan int, 2)
	go func() {
		ch1 <- 1
	}()
	time.Sleep(1 * time.Second)
	select {
	case v1 := <-ch1:
		fmt.Printf("get v1 chan value %d", v1)
	case v2 := <-ch2:
		fmt.Printf("get v1 chan value %d", v2)
	default:
		fmt.Println(22)
	}
}

有case,無default

會阻塞 一直等到case匹配上

package main
import (
	"fmt"
	"time"
)
func main() {
	ch1 := make(chan int, 2)
	ch2 := make(chan int, 2)
	fmt.Printf("start unix:%d \n", time.Now().Unix())
	go func() {
		time.Sleep(3 * time.Second)
		ch1 <- 1
	}()
	select {
	case v1 := <-ch1:
		fmt.Printf("case unix: %d \n", time.Now().Unix())
		fmt.Printf("get v1 chan value %d \n", v1)
	case v2 := <-ch2:
		fmt.Printf("get v1 chan value %d \n", v2)
	}
	fmt.Println("end")
}

select 只匹配一次,如果要進行 n > 1 的 匹配,使用 for + select

package main
import (
	"fmt"
	"time"
)
func main() {
	ch1 := make(chan int, 2)
	ch2 := make(chan int, 2)
	fmt.Printf("start unix:%d \n", time.Now().Unix())
	go func() {
		for {
			time.Sleep(1 * time.Second)
			ch1 <- 1
		}
	}()
	for {
		select {
		case v1 := <-ch1:
			fmt.Printf("case unix: %d \n", time.Now().Unix())
			fmt.Printf("get v1 chan value %d \n", v1)
		case v2 := <-ch2:
			fmt.Printf("get v1 chan value %d \n", v2)
		}
	}
}

匹配是無序的

package main
import (
	"fmt"
	"time"
)
func test() {
	ch1 := make(chan int)
	ch2 := make(chan int)
	go func() {
		ch1 <- 1
		close(ch1)
	}()
	go func() {
		time.Sleep(1 * time.Second)
		ch2 <- 1
		close(ch2)
	}()
	time.Sleep(2 * time.Second)
	// 如果有順序,那么因該每次都是v1
	select {
	case v1 := <-ch1:
		fmt.Printf("case unix: %d \n", time.Now().Unix())
		fmt.Printf("get v1 chan value %d \n", v1)
	case v2 := <-ch2:
		fmt.Printf("case unix: %d \n", time.Now().Unix())
		fmt.Printf("get v2 chan value %d \n", v2)
	}
}
func main() {
	for i := 0; i < 10; i++ {
		test()
	}
}

到此這篇關于掌握Golang中的select語句實現(xiàn)并發(fā)編程的文章就介紹到這了,更多相關Golang中的select語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 深入理解Golang的單元測試和性能測試

    深入理解Golang的單元測試和性能測試

    Go語言提供了強大的測試工具,下面這篇文章主要給大家介紹了關于Golang單元測試和性能測試的相關資料,文中通過示例代碼給大家詳細介紹了單元測試和性能測試的相關內(nèi)容,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • Go語言小白入門刷題打印輸出沙漏

    Go語言小白入門刷題打印輸出沙漏

    這篇文章主要介紹了Go語言刷題打印輸出沙漏的示例過程詳解,非常適合剛入門Go語言的小白學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • GO語言實現(xiàn)文件上傳的示例代碼

    GO語言實現(xiàn)文件上傳的示例代碼

    這篇文章主要分享一下golang實現(xiàn)文件上傳的流程和具體代碼,供大家參考,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-08-08
  • Go字典使用詳解

    Go字典使用詳解

    今天和大家一起學習Go語言的字典。Go語言的字典又稱為map,一種使用廣泛的數(shù)據(jù)結構。它是擁有key/value對元素的「無序集合」,而且在集合中key必須是唯一的
    2022-11-11
  • Go ORM的封裝解決方式詳解

    Go ORM的封裝解決方式詳解

    這篇文章主要為大家介紹了Go ORM的封裝解決方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Golang在Mac、Linux、Windows下如何交叉編譯的實現(xiàn)

    Golang在Mac、Linux、Windows下如何交叉編譯的實現(xiàn)

    這篇文章主要介紹了Golang在Mac、Linux、Windows下如何交叉編譯的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Golang實現(xiàn)自己的Redis(pipeline客戶端)實例探索

    Golang實現(xiàn)自己的Redis(pipeline客戶端)實例探索

    這篇文章主要為大家介紹了Golang實現(xiàn)自己的Redis(pipeline客戶端)實例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • golang模擬實現(xiàn)帶超時的信號量示例代碼

    golang模擬實現(xiàn)帶超時的信號量示例代碼

    這篇文章主要給大家介紹了關于golang模擬實現(xiàn)帶超時的信號量的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。
    2017-09-09
  • Go?語言結構體鏈表的基本操作

    Go?語言結構體鏈表的基本操作

    鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結構,數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的,這篇文章主要介紹了Go?語言結構體鏈表,需要的朋友可以參考下
    2022-04-04
  • Go?Gin框架優(yōu)雅重啟和停止實現(xiàn)方法示例

    Go?Gin框架優(yōu)雅重啟和停止實現(xiàn)方法示例

    Web應用程序中,有時需要重啟或停止服務器,無論是因為更新代碼還是進行例行維護,這時需要保證應用程序的可用性和數(shù)據(jù)的一致性,就需要優(yōu)雅地關閉和重啟應用程序,即不丟失正在處理的請求和不拒絕新的請求,本文將詳解如何在Go語言中使用Gin這個框架實現(xiàn)優(yōu)雅的重啟停止
    2024-01-01

最新評論

濉溪县| 合山市| 资阳市| 兴化市| 方山县| 琼结县| 溧水县| 建阳市| 天等县| 房产| 永城市| 永和县| 清苑县| 秦安县| 莱阳市| 临西县| 忻城县| 泊头市| 惠水县| 桑植县| 竹北市| 丹东市| 广元市| 常德市| 浦江县| 鄂伦春自治旗| 会昌县| 新乡县| 永寿县| 商南县| 满城县| 临颍县| 淄博市| 孝昌县| 沾益县| 偏关县| 广东省| 云安县| 台中市| 景谷| 友谊县|