iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
自我挑戰組

Go語言自學挑戰系列 第 21

第二十二天:Goroutine 介紹(3)channels 探討

  • 分享至 

  • xImage
  •  

channels介紹

channel的可讓不同的goroutines相互溝通,

可將channel想像成一個管子,管子連接不同的goroutines並相互傳遞資料,

如下圖示意,兩隻土撥鼠在管子中互丟球XDD


圖片來源:https://ucarecdn.com/27841b05-0ecb-4a22-a0c3-1047e9ef0a2f/

實驗:如果沒有使用channel會發生什麼事??

實作goroutines相互傳資料做累加。

package main

import (
	"fmt"
	"time"
)

func add(pt *int, num int, t int) {
	time.Sleep(100 * time.Millisecond)
	*pt = *pt + num
	fmt.Println(t, "-num的值", *pt)

}
func main() {
	var num int = 10
	var pt *int //宣告一個指標
	pt = &num   //取得num的記憶體位置
	
	go add(pt, 10, 1)
	go add(pt, 10, 2)
	add(pt, 10, 3)
}

每次輸出結果都不同

1 -num的值 20
3 -num的值 30

實作channels

  • 宣告channel,資料型別為goroutines接收與傳送的資料型別,
c := make(chan 資料型別)
  • 傳送: channel <-

  • 接收: <- channel

  • 關閉channel:close(channel)

參考資料範例為例:

package main

import "fmt"

// Prints a greeting message using values received in
// the channel
func greet(c chan string) {
	name := <-c // 接收channel資料
	fmt.Println("Hello", name)
}

func main() {
	c := make(chan string) //宣告一個channel,資料類型string
	go greet(c)
	c <- "World" //發送channel資料
	
	close(c)     // 關閉channel
}

輸出結果:

Hello World

修改實驗的範例

使用channel傳遞、接收資料做累加。

package main

import (
	"fmt"
	"time"
)
func add(c chan int, num int, t int) {
	time.Sleep(100 * time.Millisecond)
	a := <-c // 接收channel資料
	a = a + num
	fmt.Println(t, "-num的值", a)
	c <- a //發送channel資料
}
func main() {

	c := make(chan int) //宣告一個channel,資料類型int
	var num int = 10
	go add(c, 10, 1)
	c <- num  //發送channel資料
	num = <-c // 接收channel資料
	fmt.Println(num)

	go add(c, 10, 2)
	c <- num  //發送channel資料
	num = <-c // 接收channel資料
	fmt.Println(num)

	go add(c, 10, 3)
	c <- num  //發送channel資料
	num = <-c // 接收channel資料
	fmt.Println(num)

	close(c) // 關閉channel
}

輸出結果:

1 -num的值 20
num =  20
2 -num的值 30
num =  30
3 -num的值 40
num =  40

結語

以上是實驗的範例,不曉得在撰寫上有沒有什麼錯誤,
如有錯誤歡迎指教~
/images/emoticon/emoticon02.gif

參考資料

  1. https://www.educative.io/answers/what-are-channels-in-golang

上一篇
第二十一天:Goroutine 介紹(2):協程同步sync.WaitGroup
下一篇
第二十三天:Goroutine 介紹(4)channels 緩衝Bufferied
系列文
Go語言自學挑戰29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言