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 [email protected].
For more options, visit https://groups.google.com/d/optout.