package common import ( "time" ) func SafeSendBool(ch chan bool, value bool) (closed bool) { defer func() { // Recover from panic if one occured. A panic would mean the channel was closed. if recover() != nil { closed = true } }() // This will panic if the channel is closed. ch <- value // If the code reaches here, then the channel was not closed. return false } func SafeSendString(ch chan string, value string) (closed bool) { defer func() { // Recover from panic if one occured. A panic would mean the channel was closed. if recover() != nil { closed = true } }() // This will panic if the channel is closed. ch <- value // If the code reaches here, then the channel was not closed. return false } // SafeSendStringTimeout send, return true, else return false func SafeSendStringTimeout(ch chan string, value string, timeout int) (closed bool) { defer func() { // Recover from panic if one occured. A panic would mean the channel was closed. if recover() != nil { closed = false } }() // This will panic if the channel is closed. select { case ch <- value: return true case <-time.After(time.Duration(timeout) * time.Second): return false } }