const debugSelect … type scase … var chansendpc … var chanrecvpc … func selectsetpc(pc *uintptr) { … } func sellock(scases []scase, lockorder []uint16) { … } func selunlock(scases []scase, lockorder []uint16) { … } func selparkcommit(gp *g, _ unsafe.Pointer) bool { … } func block() { … } // selectgo implements the select statement. // // cas0 points to an array of type [ncases]scase, and order0 points to // an array of type [2*ncases]uint16 where ncases must be <= 65536. // Both reside on the goroutine's stack (regardless of any escaping in // selectgo). // // For race detector builds, pc0 points to an array of type // [ncases]uintptr (also on the stack); for other builds, it's set to // nil. // // selectgo returns the index of the chosen scase, which matches the // ordinal position of its respective select{recv,send,default} call. // Also, if the chosen scase was a receive operation, it reports whether // a value was received. func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, nsends, nrecvs int, block bool) (int, bool) { … } func (c *hchan) sortkey() uintptr { … } type runtimeSelect … type selectDir … const _ … const selectSend … const selectRecv … const selectDefault … //go:linkname reflect_rselect reflect.rselect func reflect_rselect(cases []runtimeSelect) (int, bool) { … } func (q *waitq) dequeueSudoG(sgp *sudog) { … }