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的線程方法還來不及執行完(打開文件的速度相對較慢),所以僅僅執行一次文件操作就結束了

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