亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有一個go語言的問題不是很理解,關于以下channel的問題

有一個go語言的問題不是很理解,關于以下channel的問題

慕村9548890 2021-06-07 11:07:44
package mainimport "fmt"import "os"func Count(ch chan int, i int){ ch <- i file, err := os.OpenFile("data.dat",os.O_CREATE|os.O_APPEND,0777) if err !=nil{ fmt.Println("xxx") return } str := "abc" num,_ := file.WriteString(str) defer file.Close() fmt.Println(num)}func main(){ chs := make([]chan int, 10) for i:=0;i<10;i++ { chs[i] = make(chan int) go Count(chs[i], i) } for _, ch:= range(chs) { num:= <-ch fmt.Print(num) } fmt.Print("\n")}Count方法中字符串怎么寫不進去?為什么Count方法中的打印就只打印一次?chs中明顯寫進了10次值.......小白求大神解答................................
查看完整描述

2 回答

?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

第一個問題,打開文件應添加"|os.O_WRONLY"
file, err := os.OpenFile("data.dat",os.O_CREATE|os.O_APPEND|os.O_WRONLY,0777)
第二個問題,將Count方法中的 "ch<-i"放到方法的最后一行就可以了。
因為一旦“ch<-i"執行了,main方法中的 "<-ch"就會執行通過當所有的"<-ch"執行完后程序就結束了。但這時Count的線程方法還來不及執行完(打開文件的速度相對較慢),所以僅僅執行一次文件操作就結束了

查看完整回答
反對 回復 2021-06-15
?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

可以先試想下運行結果。其結果就是,沒有任何輸出,程序直接就結束了。我的理解:因為這是個緩沖的channel(var c = make(chan int,3)),所以存的優先級會高,如果存入緩沖的不足三個,那就等下去(名詞叫阻塞),等到程序都結束了。這里要好好理解阻塞的含義。剛開始我以為阻塞只是阻止了channel變量的讀取,后來試了幾次才知道,所謂的阻塞,說白了就是什么都不干了,就等著某個條件滿足之后才會有事件的執行。
  然后改變參數或者是做一些比較小的改動,看程序的運行結果是否會發生變化。在16行后面再增加兩個存值操作,c<-11 ;c<-12數值是多少無所謂,因為就只有一次取,取到的肯定是存進去的第一個值??梢圆乱幌逻@次的運行結果。這次,跟原來一樣,還是沒有輸出,因為三次存操作之后,阻塞就解開了,開始執行取操作,但是取完之后緩沖中又不足三個了,沒辦法,還得阻塞,一直等到了程序結束,hello world被漫長的等待覆蓋了。再增加一個存操作,就得到了結果,3 helloworld。過程大致為,當三個存滿了之后,阻塞被解除了,去執行一個goroutine,即進行了一次取操作,輸出3,取完之后又被阻塞,然后又存了一個,阻塞解除,執行后面的操作,輸出了hello world.

查看完整回答
反對 回復 2021-06-15
  • 2 回答
  • 0 關注
  • 237 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號