mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-09-26 23:05:55 +08:00
135 lines
2.5 KiB
Go
135 lines
2.5 KiB
Go
package util
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"math/rand"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
)
|
|
|
|
type ReadWriteSeekCloser interface {
|
|
io.Reader
|
|
io.Writer
|
|
io.Seeker
|
|
io.Closer
|
|
}
|
|
|
|
type Recyclable interface {
|
|
Recycle()
|
|
}
|
|
|
|
type Object = map[string]any
|
|
|
|
func Conditional[T any](cond bool, t, f T) T {
|
|
if cond {
|
|
return t
|
|
} else {
|
|
return f
|
|
}
|
|
}
|
|
|
|
// Bit1 检查字节中的某一位是否为1 |0|1|2|3|4|5|6|7|
|
|
func Bit1(b byte, index int) bool {
|
|
return b&(1<<(7-index)) != 0
|
|
}
|
|
|
|
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|
|
|
func RandomString(length int) string {
|
|
seededRand := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
b := make([]byte, length)
|
|
for i := range b {
|
|
b[i] = charset[seededRand.Intn(len(charset))]
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
func RandomNumString(length int) string {
|
|
seededRand := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
b := make([]byte, length)
|
|
for i := range b {
|
|
b[i] = "0123456789"[seededRand.Intn(10)]
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
func InitFatalLog(fatal_log_dir string) *os.File {
|
|
os.MkdirAll(fatal_log_dir, 0766)
|
|
fatal_log := filepath.Join(fatal_log_dir, "latest.log")
|
|
info, err := os.Stat(fatal_log)
|
|
if err == nil && info.Size() != 0 {
|
|
os.Rename(fatal_log, filepath.Join(fatal_log_dir, info.ModTime().Format("2006-01-02 15:04:05")+".log"))
|
|
}
|
|
logFile, err := os.OpenFile(fatal_log, os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666)
|
|
if err != nil {
|
|
log.Println("服务启动出错", "打开异常日志文件失败", err)
|
|
return nil
|
|
}
|
|
return logFile
|
|
}
|
|
|
|
func Exist(filename string) bool {
|
|
_, err := os.Stat(filename)
|
|
return err == nil || os.IsExist(err)
|
|
}
|
|
|
|
type ReuseArray[T any] []T
|
|
|
|
func (s *ReuseArray[T]) GetNextPointer() (r *T) {
|
|
ss := *s
|
|
l := len(ss)
|
|
if cap(ss) > l {
|
|
ss = ss[:l+1]
|
|
} else {
|
|
var new T
|
|
ss = append(ss, new)
|
|
}
|
|
*s = ss
|
|
r = &((ss)[l])
|
|
if resetter, ok := any(r).(Resetter); ok {
|
|
resetter.Reset()
|
|
}
|
|
return r
|
|
}
|
|
|
|
func (s ReuseArray[T]) RangePoint(f func(yield *T) bool) {
|
|
for i := range len(s) {
|
|
if !f(&s[i]) {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s *ReuseArray[T]) Reset() {
|
|
*s = (*s)[:0]
|
|
}
|
|
|
|
func (s *ReuseArray[T]) Reduce() ReuseArray[T] {
|
|
ss := *s
|
|
ss = ss[:len(ss)-1]
|
|
*s = ss
|
|
return ss
|
|
}
|
|
|
|
func (s *ReuseArray[T]) Remove(item *T) bool {
|
|
count := s.Count()
|
|
for i := range count {
|
|
if &(*s)[i] == item {
|
|
*s = append((*s)[:i], (*s)[i+1:]...)
|
|
*s = append(*s, *item)[:count-1]
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (s *ReuseArray[T]) Count() int {
|
|
return len(*s)
|
|
}
|
|
|
|
type Resetter interface {
|
|
Reset()
|
|
}
|