go常用包总结(二) 青训营

简介: go常用包总结(二) 青训营

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{
 // ...
}

以上就是这篇博客的简单内容,有关各种包的更加详细的介绍最好的就是看官方文档。

相关文章
|
11天前
|
安全 测试技术 Go
Golang深入浅出之-Go语言单元测试与基准测试:testing包详解
【4月更文挑战第27天】Go语言的`testing`包是单元测试和基准测试的核心,简化了测试流程并鼓励编写高质量测试代码。本文介绍了测试文件命名规范、常用断言方法,以及如何进行基准测试。同时,讨论了测试中常见的问题,如状态干扰、并发同步、依赖外部服务和测试覆盖率低,并提出了相应的避免策略,包括使用`t.Cleanup`、`t.Parallel()`、模拟对象和检查覆盖率。良好的测试实践能提升代码质量和项目稳定性。
16 1
|
11天前
|
安全 Go
Golang深入浅出之-Go语言标准库中的文件读写:io/ioutil包
【4月更文挑战第27天】Go语言的`io/ioutil`包提供简单文件读写,适合小文件操作。本文聚焦`ReadFile`和`WriteFile`函数,讨论错误处理、文件权限、大文件处理和编码问题。避免错误的关键在于检查错误、设置合适权限、采用流式读写及处理编码。遵循这些最佳实践能提升代码稳定性。
21 0
|
11天前
|
缓存 编译器 Go
【Go语言专栏】理解Go语言的包管理机制
【4月更文挑战第30天】Go语言包管理是构建可维护应用的关键,从基本概念如包导入、初始化到版本管理和依赖管理,再到Go Modules的引入,简化了过程。包的可见性规则和社区生态也至关重要。理解并掌握这些机制对于编写高质量Go代码具有决定性影响。随着Go语言的持续发展,包管理将更加强大易用。
|
12天前
|
安全 Unix Go
Golang深入浅出之-Go语言中的时间与日期处理:time包详解
【4月更文挑战第26天】Go语言的`time`包提供处理日期和时间的功能,包括`time.Time`类型、时间戳、格式化与解析。本文讨论了核心概念、常见问题(如时区处理、格式字符串混淆、超时控制和并发安全)及解决方法。推荐使用`time.LoadLocation`管理时区,熟悉时间格式规则,用`context`精确控制超时,并注意并发安全。文中通过代码示例展示了如何获取格式化时间、计算时间差以及创建定时任务。学习和应用这些知识可提高程序的健壮性和准确性。
28 2
|
12天前
|
XML JSON Go
Golang深入浅出之-XML处理在Go语言中的实现:encoding/xml包
【4月更文挑战第26天】Go语言的`encoding/xml`库提供XML处理,包括序列化和反序列化。本文讨论了XML处理的基础,如`xml.Marshal`和`xml.Unmarshal`函数,以及常见问题和易错点,如标签命名、结构体嵌套、omitempty标签和命名空间。建议遵循标签命名规则,正确处理嵌套和属性,谨慎使用omitempty,以及理解并有效利用命名空间。文中还给出了基础示例和处理XML属性的代码示例,帮助读者掌握XML处理技巧。
23 1
Golang深入浅出之-XML处理在Go语言中的实现:encoding/xml包
|
13天前
|
数据管理 Go 开发者
Golang深入浅出之-Go语言上下文(context)包:处理取消与超时
【4月更文挑战第25天】Go语言中的`context`包在并发、网络请求和长任务中至关重要,提供取消、截止时间和元数据管理。本文探讨`context`基础,如`Background()`、`TODO()`、`WithCancel()`、`WithDeadline()`和`WithTimeout()`。常见问题包括不当传递、过度使用`Background()`和`TODO()`以及忽略错误处理。通过取消和超时示例,强调正确传递上下文、处理取消错误和设置超时以提高应用健壮性和响应性。正确使用`context`是构建稳定高效Go应用的关键。
22 1
|
15天前
|
Go 开发者
Golang深入浅出之-Go语言上下文(context)包:处理取消与超时
【4月更文挑战第23天】Go语言的`context`包提供`Context`接口用于处理任务取消、超时和截止日期。通过传递`Context`对象,开发者能轻松实现复杂控制流。本文解析`context`包特性,讨论常见问题和解决方案,并给出代码示例。关键点包括:1) 确保将`Context`传递给所有相关任务;2) 根据需求选择适当的`Context`创建函数;3) 定期检查`Done()`通道以响应取消请求。正确使用`context`包能提升Go程序的控制流管理效率。
21 1
|
15天前
|
存储 安全 Go
Golang深入浅出之-原子操作包(sync/atomic)在Go中的应用
【4月更文挑战第23天】Go语言的`sync/atomic`包支持原子操作,防止多线程环境中的数据竞争。包括原子整数和指针操作,以及原子标量函数。常见问题包括误用非原子操作、误解原子操作语义和忽略内存排序约束。解决方法是使用原子函数、结合其他同步原语和遵循内存约束。注意始终使用原子操作处理共享变量,理解其语义限制,并熟悉内存排序约束,以实现并发安全和高效的应用程序。
25 1
|
18天前
|
编译器 Go 开发者
Go语言入门|包、关键字和标识符
Go语言入门|包、关键字和标识符
33 0
|
1月前
|
数据可视化 数据挖掘 Go
GOplot|宝藏R包,拯救你的GO富集结果,杜绝平庸的条形图
`GOplot`是一款R包,专注于GO富集分析的可视化,提供多种图表类型如GOBar、GOBubble、GOCircle、GOChord和GOVenn等。这些函数允许用户轻松修改参数,定制颜色、大小和排序,实现数据的直观展示。示例代码展示了如何使用这些功能创建不同类型的图形,并提到了一个配套的shiny应用。`GOplot`简化了复杂的数据可视化过程,适合快速高效地展示差异分析结果。
28 0