golang并发写slice

package sliceSafe type SliceSafe struct { channel chan int `desc:"即将加入到数据slice的数据"` data []int `desc:"数据slice"` } // 新建一个size大小缓存的active object对象 func New(size int, done func()) *SliceSafe { s := &SliceSafe{ channel: make(chan int, size), data: make([]int, 0), } go func() { s.schedule() done() }() return s } // 把管道中的数据append到slice中 func (s *SliceSafe) schedule() { for v := range s.channel { s.data = append(s.data, v) } } // 增加一个值 func (s *SliceSafe) Add(v int) { s....

May 21, 2021 · 1 min · zakudriver

redis发布订阅

redis发布订阅 相比rabbitmq等专业消息队列的缺陷: 没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中。 package main import ( "context" "fmt" "log" "strconv" "time" "github.com/gomodule/redigo/redis" ) // ConsumeFunc consumes message at the channel. type ConsumeFunc func(channel string, message []byte) error // RedisClient represents a redis client with connection pool. type RedisClient struct { pool *redis.Pool } // NewRedisClient returns a RedisClient. func NewRedisClient(addr string, passwd string) *RedisClient { pool := &redis.Pool{ MaxIdle: 10, IdleTimeout: 300 * time.Second, Dial: func() (redis.Conn, error) { c, err := redis....

July 2, 2020 · 3 min · zakudriver

限制goroutine数量

package main import ( "fmt" "sync" "time" ) type Glimit struct { n int c chan struct{} } func New(n int) *Glimit { return &Glimit{ n: n, c: make(chan struct{}, n), } } func (g *Glimit) Run(f func()) { g.c <- struct{}{} go func() { f() <-g.c }() } var wg = sync.WaitGroup{} func main() { number := 10 g := New(2) for i := 0; i < number; i++ { wg....

July 2, 2020 · 1 min · zakudriver

golang gc优化

小对象要合并 函数频繁创建的简单的对象,直接返回对象,效果比返回指针效果要好 类型转换要注意,官方用法消耗特别大。 package string_util import ( "unsafe" ) func str2bytes(s string) []byte { x := (*[2]uintptr)(unsafe.Pointer(&s)) h := [3]uintptr{x[0], x[1], x[1]} return *(*[]byte)(unsafe.Pointer(&h)) } func bytes2str(b []byte) string { return *(*string)(unsafe.Pointer(&b)) } 避免反复创建slice,map func(r*Reader)Read()([]byte,error) // 此函数没有形参,每次调用的时候返回一个[]byte。 func(r*Reader)Read(buf[]byte)(int,error) // 此函数个函数在每次迪调用的时候,会重用形参声明。 避免使用"+“拼接字符串 package string_utils import ( "strings" ) func strAppend(s string, ss ...string) string { var r strings.Builder r.WriteString(s) for _, v := range ss { r.WriteString(v) } return r.String() }

June 23, 2020 · 1 min · zakudriver

golang time工具函数

package util-time import ( "strconv" "time" ) // 获取当前的时间 - 字符串 func GetCurrentDate() string { return time.Now().Format("2006/01/02 15:04:05") } // 获取当前的时间 - Unix时间戳 func GetCurrentUnix() int64 { return time.Now().Unix() } // 获取当前的时间 - 毫秒级时间戳 func GetCurrentMilliUnix() int64 { return time.Now().UnixNano() / 1000000 } // 获取当前的时间 - 纳秒级时间戳 func GetCurrentNanoUnix() int64 { return time.Now().UnixNano() } func GetCurrentTime() string { var cstSh, _ = time.LoadLocation("Asia/Shanghai") t := time.Now().In(cstSh).Format("2006/01/02/ 15:04:05") return t } func GetCurrentHour() int { var cstSh, _ = time....

June 23, 2020 · 1 min · zakudriver