go
常用包总结(二)
这篇博客继续对go
语言的常用包进行总结,主要包括:os
包、strconv
包、 sync
包、time
包。
一、os
包
os.Exit(1) // 终止程序,并设置退出码 os.Remove("./xxx.c") // 删除文件 os.Rename("oldfile.c", "newfile.c") // 重命名文件
1. 文件操作
参见golang
基础语法的文件操作。
2. 获取命令行参数
os.Args[0]
二、strconv
包
这个包中主要包含各种类型间的转换。
// 字符串转整型 strconv.Atoi(str) // 字符串转整型,更高的控制(从字符串中解析整型) strconv.ParseInt(str, 进制, 位数) // 整型转字符串 strconv.Itoa(i) // 字符串转bool(从字符串中解析bool) "true" -> true, "false" -> false strconv.ParseBool(str) // 从字符串中解析float strconv.ParseFloat(str)
三、 sync
包
这个包主要是与“线程同步”有关的函数。
sycn.WaitGroup
==作为函数参数时必须传指针!!==
// 声明全局等待组变量 var wg sync.WaitGroup func hello() { defer wg.Done() // 告知当前goroutine完成 -- 操作 fmt.Println("hello") } func main() { wg.Add(1) // 登记1个goroutine ++操作 go hello() fmt.Println("你好") wg.Wait() // 阻塞等待登记的goroutine完成 等到wg减到0 }
sync.Once
在多线程中对于某些耗时的初始化工作,可以封装到一个函数里使用sync.Once
,防止多次调用。底层有加锁解锁的过程,还有一个bool
值,标记该操作是否执行过了。
var once sync.Once // ... // 确保只关闭一次,关闭已经关闭了的chan会引发panic!! // 这里用到了闭包 once.Do(func(){ close(a) }) // ... // 参数是个函数,这个函数要求没有参数,没有返回值 once.Do(f()) // 确保函数f只执行一次。
sync.Mutex
互斥锁。对临界资源加锁。
是一个结构体,值类型。所以==作为函数参数时必须传指针!!==
var lock sync.Mutex // ... lock.Lock() // 加锁 // ... lock.Unlock() // 解锁
sync.RWMutex
读写锁。一个线程获得读锁时其他线程依旧可以获取读锁,不能写;但是一个线程获得写锁时其他线程就无法再获得读锁和写锁。
适用于读多写少的场景。效率更高。
var lock sync.RWMutex // ... lock.RLock() // 加读锁 // ... lock.RUnlock() // 解读锁 lock.Lock() // 加写锁 // ... lock.Unlock() // 解写锁
sync.Map
go
本身的那个map
类型不是并发安全的。加锁也可以解决,但是map
这个类型用的非常多,所以go
提供了一个**并发安全的map
。**就是 sync.Map
同时提供了一些方法:Store
,Load
,Delete
...
var mp sync.Map // ... mp.Store(key, value) // 插入 value,ok := mp.Load(key) // 根据key获取value
四、time
包
顾名思义time
中主要是与实时间相关的变量和函数。
时间类型:time.Time
、时间戳
时间间隔类型:time.Duration
time.Nanosecond time.Microsecond time.Millisecond time.Second time.Minute time.Hour
// 返回的now是一个结构体类型,有很多方法 now := time.Now() year := Now.Year() month := Now.Month() // ... timeStamp := Now.Unix() // 时间戳 timeStampN := Now.UnixNano() // 纳秒级时间戳 // 时间运算 now.Add(time.Hour * 12) // 当前时间now加12小时 now.Sub() // 计算两个时间间隔(now和传的时间) now.Equal() now.Before() now.After() // 格式化时间---统一使用2006-01-02 15:04:05(go诞生的时间) now.Format("2006-01-02 15:04:05") // 获得当前时间 // 将时间戳转换为正常时间 t := time.Unix(timeStamp, 0) time.Tick() // 定时器 time.Sleep(2 * time.second) // 睡眠2s // 获得标准的 2023-07-27 15:03:13 时间---按照第一个参数的格式解析时间 time.Parse("2006-01-02 15:04:05", "2023-07-27 15:03:13") timer := time.Tick(time.second) // 1秒执行一次 for t := range timer{ // ... }
以上就是这篇博客的简单内容,有关各种包的更加详细的介绍最好的就是看官方文档。