channel(3) 一 基本定義

1.channel概念:緩存

  相似管道pipe安全

  先進先出測試

  線程安全,多個goroutine同時訪問,不須要加鎖spa

  channel是有類型的,整數類型的channel只能存放整數類型的數據線程

2.channel聲明 blog

var 變量名 chan 類型
var test chan int
var test chan string
var test chan map[string]string
var test chan stu
var test chan *stu
ip

3.channel相似於map,slice必須進行初始化input

var test chan int權限控制

test = make(chan int,100)    //在這裏若是容量爲0,會是什麼結果呢?string

4.channel接收數據和讀取數據

intchan <-10    //把數據發送到管道中

result := <- intchan //從channel中讀取數據,並賦值給result

接上面的疑問,若是容量爲0,會是什麼狀況呢?還有一些問題來一一驗證

沒有初始化的狀況:(報錯 nil chan)

import(
	"fmt"
)
func main() {
	var c chan int
	c <- 10
	result:= <- c
	fmt.Println(result)  //goroutine 1 [chan send (nil chan)]:
}

初始化後,容量 爲0:

import(
	"fmt"
)
func main() {
	var c chan int
	c = make(chan int,0)
	c <- 10
	result:= <- c
	fmt.Println(result)
	/*
	fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
        c:/goclass/src/day8goroutine/channel/main.go:9 +0x60
exit status 2
	*/
}

 仍是報錯,不太明顯,咱們換一種方法來測試:

import(
	"fmt"
	"time"
)
func main() {
	var c chan int
	c = make(chan int,0)
	go func(){    //開啓一個goroutine
		fmt.Println("start input to the channel")
		c <- 10
		fmt.Println("end input to the channel")
		}()
	time.Sleep(time.Second*100)
	result:= <- c
	fmt.Println(result)

}
//運行結果,會立馬輸出「start input to the channel」 這一行,而後等待100s後,會輸入result結果10。由於容量爲0的話,指的是channel沒有緩存容量 ,就是不可以緩存任何數據,若是容量改成1的話,會立馬輸出start和end兩句話。

 5.channel 權限控制

var intchan chan <- int  //intchan只可接收int類型數據

var intchan <- chan int  //只能夠從intchan中讀取數據

var intchan chan int   //便可以接收也可也讀取數據

package main

import(
	"fmt"
	"sync"
)
var waitgroup sync.WaitGroup   
func SendDate(c chan <- string){   //往chan中寫入數據,這個類型是隻寫的
	c <- "beijing"
	c <- "shanghai"
	c <- "guangzhou"
	c <- "shenzhen"
	close(c)  //寫完數據關閉channel
	waitgroup.Done()
}
func GetDate(c <- chan string){   //讀取chan中的數據,這個類型是隻讀的
	for {
		input,ok :=<-c    //檢查channel 是否關閉
		if !ok{
			fmt.Println("the chan is closed")
			break
		}
		fmt.Println(input)
	}
	waitgroup.Done()
}
func main() {
	c := make(chan string)
	waitgroup.Add(2)
	go SendDate(c)
	go GetDate(c)
	waitgroup.Wait()  //等待全部的goroutine執行完成
}

  上面的代碼中有權限的控制,goroutine和chan相結合。還有一個檢查chan是否關閉

    input,ok := <-c

遍歷chan中的元素:

for input := range c{
        fmt.Println(input)
    }
相關文章
相關標籤/搜索