從兩道題看go channel的用法

2022-07-05 01:51:09 字數 1541 閱讀 8632

在知乎看到有人分享了幾道筆試題,自己總結了一下其中與channel有關的題目。全部題目在這裡:

5、請找出下面**的問題所在。

func main() 

}()// goroutine2

go func()

fmt.println("a: ", a)

} }()

close(ch)

fmt.println("ok")

time.sleep(time.second * 100)

}

8、請說出下面****寫錯了

func main() 

// receiver goroutine

go func()

}()close(abc)

fmt.println("close")

time.sleep(time.second * 100)

}

首先要明確這兩個要點:

先看第一題,**執行時會丟擲panic:

panic: send on closed channel

這是因為goroutine1 還沒把i 傳送給ch,ch 就在main函式中被close,當把i 傳送到ch 時就丟擲了panic。同理goroutine2 中從已關閉的ch 中接收資料時ok 會返回false,然後就return了。而且由於goroutine 的執行順序不一樣,輸出close、ok、panic的順序也會不一樣,有興趣的話可以自己跑幾次。

那麼如果想讓程式正常輸出應該怎麼改呢,下面是其中一種方法:

func main() 

// 只有乙個goroutine向ch傳送資料,可以考慮在這個goroutine中關閉。

close(ch)

}()// goroutine2

go func()

fmt.println("a: ", a)

} }()

fmt.println("ok")

time.sleep(time.second * 100)

}

再來看第二題,執行時輸出完0—9後會一直輸出0,直到sleep的時間結束。這是因為在把0—9傳送給abc 後abc 就被關閉了,receiver goroutine 在接收完0—9後沒有跳出for 迴圈,而是一直從被關閉的abc 中接收資料,所以接收到的是abc 的零值——0。

有一種最簡單的辦法可以改正這個程式:

func main() 

go func()

}()close(abc)

fmt.println("close")

time.sleep(time.second * 10)

}

使用channel時,

益智題 (簡單的兩道題)

a公司拍攝的 黃河頌 獲最佳故事獎 b公司的 孫悟空 獲最佳武術獎 c公司的 白娘子 獲最佳戲劇獎。a公司的經理說 我們三經理的姓分別是三部片名的第乙個字,而又同自己所拍 首字不一樣。另一公司的孫經理笑著說 真是這樣 那三經理各姓什麼?答案 a白 b黃 c孫 另一公司的孫經理 說明a不姓孫,而a又不...

兩道題題引發的思考

下週的討論課又到我講 了,這幾天都在看 準備ppt,選了一篇好難的 啊,看了這麼久了,還是不夠清晰。所以決定先換下思路,做點題。下面的 輸出是什麼 void add int p add p int main 分析這個題目看起來還是比較友好的。首先我們來分析一下add 函式。其實看名字就能知道它是在做...

兩道選擇題

教授面帶微笑,走進教室,對我們說 我受一家機構委託,來做一項問卷調查,請同學們幫個忙。一聽這話,教室裡輕微的一陣議論開了,大學課堂本來枯燥,這下好玩多了。問卷表發下來,一看,只有兩道題。第一題 他很愛她。她細細的瓜子臉,彎彎的娥眉,面色白皙,美麗動人。可是有一天,她不幸遇上了車禍,痊癒後,臉上留下幾...