功能特性: - 用户端充值记录页面,从使用日志中分离 - 充值记录中的去开发票功能 - 管理员发票管理页面 - 发票申请、处理、邮件通知功能 - 侧边栏菜单更新 - UI优化和控制台清理 - Docker部署配置 - 生产环境安全配置
54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
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
|
|
}
|
|
}
|