跳过正文

Go

链表
·358 字
链表简述 # 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)
Zap日志包
·410 字
zap # go get -u go.uber.org/zap
Viper配置包
·66 字
viper # go get github.com/spf13/viper 封装加载配置方法 # package configs import "github.com/spf13/viper" func LoadConfig(filepath string, encoding string, config interface{}) error { vp := viper.New() vp.SetConfigFile(filepath) vp.SetConfigType(encoding) err := vp.ReadInConfig() if err != nil { return err } return vp.Unmarshal(config) } func ReadConfig(filepath string, encoding string) (*viper.Viper, error) { vp := viper.New() vp.SetConfigFile(filepath) vp.SetConfigType(encoding) err := vp.ReadInConfig() return vp, err }
Go Sync包
·492 字
WaitGroup # type WaitGroup func (wg *WaitGroup) Add(delta int) func (wg *WaitGroup) Done() func (wg *WaitGroup) Wait() package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup delta := 10 wg.Add(delta) for i := 1; i <= delta; i++ { go func(i int) { defer wg.Done() fmt.Println("handle ", i) }(i) } wg.Wait() fmt.Println("done") } Mutex # type Mutex func (m *Mutex) Lock() // 若锁正在被占用,则Lock()会被阻塞,直至锁被释放 func (m *Mutex) TryLock() bool // 尝试加锁,若锁被占用,则返回false,加锁失败 func (m *Mutex) Unlock() // 未被加锁的Mutex直接Unlock()则会fatal error: sync: unlock of unlocked mutex package main import ( "fmt" "sync" "time" ) func main() { var mu sync.Mutex m := make(map[string]int) for i := 1; i <= 10; i++ { go func(i int, m map[string]int) { mu.Lock() m["num"] += i mu.Unlock() }(i, m) } time.Sleep(5 * time.Second) fmt.Println(m) } RWMutex # type RWMutex func (rw *RWMutex) Lock() // 读写锁 func (rw *RWMutex) RLock() // 读锁 func (rw *RWMutex) RLocker() Locker func (rw *RWMutex) RUnlock() func (rw *RWMutex) TryLock() bool func (rw *RWMutex) TryRLock() bool func (rw *RWMutex) Unlock() 和 mutex 类似,只不过功能更多,可以只加读锁
Go Time包
·910 字
时间转换 # func Now() Time // Now returns the current local time. func Unix(sec int64, nsec int64) Time func UnixMicro(usec int64) Time // Go v1.17 func UnixMilli(msec int64) Time // Go v1.17 func (t Time) Unix() int64 func (t Time) UnixMicro() int64 // Go v1.17 func (t Time) UnixMilli() int64 // Go v1.17 func (t Time) UnixNano() int64 // Go v1.17 func ParseInLocation(layout, value string, loc *Location) (Time, error) func (t Time) Format(layout string) string 获取当前时间戳 # package main import ( "fmt" "time" ) func main() { t := time.Now() // 当前时间 fmt.Println(t.Unix()) // 秒时间戳 fmt.Println(t.UnixMilli()) // 毫秒时间戳,Go V1.17新增 fmt.Println(t.UnixMicro()) // 微秒时间戳,Go V1.17新增 fmt.Println(t.UnixNano()) // 纳秒时间戳 } 时间戳转 string # 常用 time layout 常量
Singleflight源码解读
·1211 字
singleflight应用在什么场景 # singleflight主要应用在高并发场景下,通过对相同请求进行阻塞,减少实际业务方法执行次数,减少依赖服务压力,实际应用场景主要为防止缓存击穿,在接收到请求时,查询redis缓存或查询DB返回结果之前,对后续相同请求进行阻塞,待查询结果返回后被阻塞的n个请求使用相同的返回结果。适用于只读场景。
Go语言之defer
·709 字
defer的用途 # defer是在函数执行到最后时(return之前执行),多用于保证函数结束或panic前关闭响应的资源,如关闭文件句柄、恢复panic等 可以简化程序代码
Go读取文件
·96 字
读取文件全部内容 # ioutil.ReadFile(filename string)
设计模式-单例模式
·57 字
sync.Once 实现单例模式 # package singleton import "sync" type singleton struct { // 单例对象的状态 } var ( instance *singleton once sync.Once ) func GetInstance() *singleton { once.Do(func() { instance = &singleton{} // 初始化单例对象的状态 }) return instance } https://juejin.cn/post/7209178782656348215
接口跨域问题
·277 字
前端请求接口跨域 # 前端报错信息