@@ -147,14 +147,37 @@ func selectsend(sel *hselect, c *hchan, elem unsafe.Pointer) {
147147}
148148```
149149
150+ ``` go
151+ // compiler implements
152+ //
153+ // select {
154+ // case c <- v:
155+ // ... foo
156+ // default:
157+ // ... bar
158+ // }
159+ //
160+ // as
161+ //
162+ // if selectnbsend(c, v) {
163+ // ... foo
164+ // } else {
165+ // ... bar
166+ // }
167+ //
168+ func selectnbsend (c *hchan , elem unsafe .Pointer ) (selected bool ) {
169+ return chansend (c, elem, false , getcallerpc ())
170+ }
171+ ```
172+
150173### select receive
151174
152175``` go
153176// select {
154177// case <-ch: ==> 这时候就会调用 selectrecv
155178// case ,ok <- ch: 也可以这样写
156179// 在 ch 被关闭时,这个 case 每次都可能被轮询到
157- // }
180+ // }
158181func selectrecv (sel *hselect , c *hchan , elem unsafe .Pointer , received *bool ) {
159182 pc := getcallerpc ()
160183 i := sel.ncase
@@ -179,6 +202,55 @@ func selectrecv(sel *hselect, c *hchan, elem unsafe.Pointer, received *bool) {
179202
180203```
181204
205+ ``` go
206+ // compiler implements
207+ //
208+ // select {
209+ // case v = <-c:
210+ // ... foo
211+ // default:
212+ // ... bar
213+ // }
214+ //
215+ // as
216+ //
217+ // if selectnbrecv(&v, c) {
218+ // ... foo
219+ // } else {
220+ // ... bar
221+ // }
222+ //
223+ func selectnbrecv (elem unsafe .Pointer , c *hchan ) (selected bool ) {
224+ selected, _ = chanrecv (c, elem, false )
225+ return
226+ }
227+ ```
228+
229+ ``` go
230+ // compiler implements
231+ //
232+ // select {
233+ // case v, ok = <-c:
234+ // ... foo
235+ // default:
236+ // ... bar
237+ // }
238+ //
239+ // as
240+ //
241+ // if c != nil && selectnbrecv2(&v, &ok, c) {
242+ // ... foo
243+ // } else {
244+ // ... bar
245+ // }
246+ //
247+ func selectnbrecv2 (elem unsafe .Pointer , received *bool , c *hchan ) (selected bool ) {
248+ // TODO(khr): just return 2 values from this function, now that it is in Go.
249+ selected, *received = chanrecv (c, elem, false )
250+ return
251+ }
252+ ```
253+
182254### select default
183255
184256``` go
0 commit comments