這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
這道題可以作為筆試題,現在給定下面一個條件
go func() { for i := 1; i < 10; i++ { println(2*i - 1) }}()go func() { for i := 1; i < 10; i++ { println(2 * i) }}()
讓你使用多種方式將奇偶合并,並列印自然數,這道題目很簡單,思考幾秒鐘,看看你的實現。。。。。。好了我的實現比較low,沒辦法,golang 的代碼怎麼寫都那個慫樣。。。
1.第一種方式
package mainimport ("fmt""time")var count = 15func ping(c chan<- int) {for i := 1; i < count; i++ {c <- 2*i - 1}}func pong(c chan<- int) {for i := 1; i < count; i++ {c <- 2 * i}}func print(ch <-chan int) {for {msg := <-chfmt.Println(msg)time.Sleep(time.Millisecond * 50)}}func main() {ch := make(chan int)go ping(ch)go pong(ch)go print(ch)var input stringfmt.Scanln(&input)}
上面的代碼,如果將
go print(ch) 改成下面這樣 channel不使用傳參的形式而是直接使用全域的變數可以嗎?for { msg := <-ch fmt.Println(msg) time.Sleep(time.Millisecond * 50)}如果不行的話那是為什嗎?
2.第二種方式
package mainimport ("fmt""runtime"// "time")var count = 15func main() {runtime.GOMAXPROCS(1)go func() {for i := 1; i < count; i++ {fmt.Println(2 * i)runtime.Gosched()}}()go func() {for i := 1; i < count; i++ {fmt.Println(2*i - 1)runtime.Gosched()}}()var input stringfmt.Scanln(&input)}
第二種方式,在main函數中啟用兩個Goroutinue 思考一下,交換了他們的代碼位置可不可以,為什麼那?比如這樣:
go func() { for i := 1; i < count; i++ { fmt.Println(2*i - 1) runtime.Gosched() }}()go func() { for i := 1; i < count; i++ { fmt.Println(2 * i) runtime.Gosched() }}()
這兩種方式其實都是我強行舉的一個栗子,可能不太現實,但是如果瞭解golang內部結構的話,以上問題都不攻自破,接下來細節我會在日後的文章中將上面代碼作為例子來講解channel資料結構。