Skip to content

Commit 7bc6bb8

Browse files
committed
update select
1 parent 5a31594 commit 7bc6bb8

File tree

1 file changed

+73
-1
lines changed

1 file changed

+73
-1
lines changed

select.md

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
// }
158181
func 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

Comments
 (0)