iT邦幫忙

0

Golang channel入門 請教

  • 分享至 

  • twitterImage

您好:
參考

https://ithelp.ithome.com.tw/articles/10205301

package main

import (
	"fmt"
)

var message chan string

func Bot() {
	msg := <-message
	fmt.Printf("Bot Print:%s\n", msg)
}

func main() {
	//這裡為宣告 5 個 channel buffer,意思就是可以quene 5個 string
	message = make(chan string, 5)

	go Bot()

	message <- "first message"
	fmt.Println("first message send finish")
	message <- "second message"
	fmt.Println("second message send finish")

	fmt.Println("end")
}

但結果,就算加了sleep
也只收到 fmt.Printf("Bot Print:%s\n", msg) 第一筆紀錄
其他都收不到??
請問這算正常嗎?
謝謝

你的 bot 只從 channel 拉了一次.
幫你修改了.你看的那篇,他下面的改寫,沒改好,他也沒執行.
我在go 1.0 剛發行時,就有寫了. 那都好幾年前的了.
你也可以參考看看.
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
一級屠豬士
iT邦大師 1 級 ‧ 2020-07-07 22:41:22
最佳解答
// ithelp0707.go
// Craeted: 2020-07-07 22:35:39 
// ---------------------
package main

import (
  "fmt"
  "time"
)

var message chan string

func Bot() {
  for msg := range message {
    fmt.Printf("Bot Print:%s\n", msg)
  }
}

func main() {
  message = make(chan string, 5)

  go Bot()

  message <- "first message"
  fmt.Println("Main: first message send finish")
  message <- "second message"
  fmt.Println("Main: second message send finish")
  
  time.Sleep(1 * time.Second)
  fmt.Println("Main: end")
}

執行結果:
https://ithelp.ithome.com.tw/upload/images/20200707/20050647TBztw4gP2r.png

這裡有我以前寫的另外的範例.
https://ithelp.ithome.com.tw/articles/10158450?sc=pt

noway iT邦研究生 3 級 ‧ 2020-07-08 20:56:13 檢舉

謝謝您!

0
eric19740521
iT邦新手 1 級 ‧ 2020-08-03 03:10:02

也可以這麼做


package main

import (
	"fmt"
	"time"
)


var message chan string

func Bot() {
	for {
	
		msg := <-message
		fmt.Printf("Bot Print:%s\n", msg)	
	}

}

func main() {
	//這裡為宣告 5 個 channel buffer,意思就是可以quene 5個 string
	message = make(chan string, 5)

	go Bot()

	message <- "first message"
	fmt.Println("first message send finish")
	message <- "second message"
	fmt.Println("second message send finish")

	fmt.Println("end")
	
	time.Sleep(5 * time.Second)
}

go Bot()照底下寫法
執行完 bot()就會完全結束
記得要加 for 讓他一直在執行中
(沒資料時,它會阻塞...也就是卡住,等待資料)


func Bot() {
	msg := <-message
	fmt.Printf("Bot Print:%s\n", msg)
}
noway iT邦研究生 3 級 ‧ 2020-08-06 20:28:38 檢舉

謝謝1

我要發表回答

立即登入回答