TL;DR Does assigning a (buffered) channel, already in a variable, to a second variable, affects the result of len function?
Long version: What is happening here? - Code at the end; Go 1.7. *Output 1*: Nine times: [ info ] 2016/08/28 19:51:28 LEN_BEFORE=0 [ info ] 2016/08/28 19:51:28 LEN=7 [ info ] 2016/08/28 19:51:28 S00=7 But if the second case gets commented like this: case <-limiter.C: // if len(actualBuffer) > 0 { // buffer = actualBuffer // } else { // buffer = nil // } It works as expected; *Output2*: [ info ] 2016/08/28 19:54:28 LEN_BEFORE=0 [ info ] 2016/08/28 19:54:28 LEN=7 [ info ] 2016/08/28 19:54:28 S00=7 [ info ] 2016/08/28 19:54:29 LEN_BEFORE=7 [ info ] 2016/08/28 19:54:30 LEN_BEFORE=7 [ info ] 2016/08/28 19:54:31 LEN_BEFORE=7 [ info ] 2016/08/28 19:54:32 LEN_BEFORE=7 [ info ] 2016/08/28 19:54:33 LEN_BEFORE=7 [ info ] 2016/08/28 19:54:34 LEN_BEFORE=7 [ info ] 2016/08/28 19:54:35 LEN_BEFORE=7 [ info ] 2016/08/28 19:54:36 LEN_BEFORE=7 ... Code: package main import ( "log" "time" "github.com/comail/colog" ) func status00Channeler() { <-start limiter := time.NewTicker(time.Second / maxMsgPerSec) fetchLimiter := time.NewTicker(time.Second) var buffer chan *Data actualBuffer := make(chan *Data, maxMsgPerSec) db, err := newDB() if err != nil { log.Panic(err) } FIRST: for { select { case <-interrupted: break FIRST case <-limiter.C: // if len(actualBuffer) > 0 { // buffer = actualBuffer // } else { // buffer = nil // } case i := <-buffer: select { case status00 <- i: // will block here case <-interrupted: break FIRST } case <-fetchLimiter.C: log.Printf("LEN_BEFORE=%d", len(actualBuffer)) if len(actualBuffer) > 0 { continue } s00, err := db.GetIncomings() if err != nil { log.Println(`error:`, err) time.Sleep(time.Second) continue } if s00 == nil || len(s00) == 0 { continue } FILL_BUFFER: for _, v := range s00 { select { case actualBuffer <- v: default: break FILL_BUFFER } } log.Printf("LEN=%d", len(actualBuffer)) log.Printf("S00=%d", len(s00)) } } } func main() { go status00Channeler() close(start) <-time.After(time.Second * 30) } var ( status00 = make(chan *Data, maxMsgPerSec) ) type Data struct{} const ( maxMsgPerSec = 60 ) func newDB() (*DB, error) { res := new(DB) return res, nil } func (db *DB) GetIncomings() ([]*Data, error) { var res []*Data res = append(res, &Data{}) res = append(res, &Data{}) res = append(res, &Data{}) res = append(res, &Data{}) res = append(res, &Data{}) res = append(res, &Data{}) res = append(res, &Data{}) return res, nil } type DB struct{} func init() { colog.Register() } var ( start = make(chan struct{}) interrupted = make(chan struct{}) // comes from sys interrupts SIGINT, SIGTERM, etc ) -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.