iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 19
1
Modern Web

30天就Go:教你打造LINE自動回話機器人系列 第 19

30天就Go(19):Channels

Channel

Channel的中文應該就叫做通道,可以用來Send和Receive資料,使用起來頗抽象,我也是第一次接觸這種概念。似乎在Goroutine實作時會常常見到他?


如何使用

宣告

這邊又要請到我們的make好幫手,channel也是有型別的!

c := make(chan int)

Send

要將東西送到channel就把資料指向channel變數就好了

c <- 5

Receive

就將箭頭往外指

x := <-c

Close()

當Channel被Close之後,就只能讀取不能寫入了

close(c)

當變數傳遞

channel其實就是一個變數,在function裡是可以傳入傳出的

傳入

func foo(c chan int) {
    // do something
}

傳出

func foo() {
    // do something
}

範例篇

因為這東西我個人覺得太抽象了,講幾個範例可能會比較容易懂

範例一

package main

import (
	"fmt"
)

func main() {
	c := make(chan int) 

    // 在goroutine之下執行這個function
	go func() { 
		for i := 0; i < 10; i++ {
			c <- i 
		}
		close(c)
	}()

	for n := range c {
		fmt.Println(n) 
	}
}

在Go Playground上執行

在這裡go func()將i傳入c,下面的for會等待c有什麼時候有新東西,一有新東西他就會print出來

範例二

package main

import (
	"fmt"
)

func main() {

	c := make(chan int)
	done := make(chan bool)

	go func() {
		for i := 0; i < 10; i++ {
			c <- i
		}
		done <- true
	}()

	go func() {
		for i := 0; i < 10; i++ {
			c <- i
		}
		done <- true
	}()

	go func() {
		<-done
		<-done
		close(c)
	}()

	for n := range c {
		fmt.Println(n)
	}
}

在Go Playground上執行

這個範例是要示範如何將資料從Channel Send出去(<-done),要注意的是send出去的同時資料也會在channel裡面刪除,所以要確定使用send的情況是有資料可以send的,要不然就會一直等待有東西可以send,因此卡在send那行


上一篇
30天就Go(18):Error Handling
下一篇
30天就Go(20):LINE REBOT 00 準備篇
系列文
30天就Go:教你打造LINE自動回話機器人23

尚未有邦友留言

立即登入留言