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

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

相关文章
|
5月前
|
Go 开发者
Go语言包的组织与导入 -《Go语言实战指南》
本章详细介绍了Go语言中的包(Package)概念及其使用方法。包是实现代码模块化、复用性和可维护性的核心单位,内容涵盖包的基本定义、命名规则、组织结构以及导入方式。通过示例说明了如何创建和调用包,并深入讲解了`go.mod`文件对包路径的管理。此外,还提供了多种导入技巧,如别名导入、匿名导入等,帮助开发者优化代码结构与可读性。最后以表格形式总结了关键点,便于快速回顾和应用。
270 61
|
1月前
|
Java 编译器 Go
【Golang】(1)Go的运行流程步骤与包的概念
初次上手Go语言!先来了解它的运行流程吧! 在Go中对包的概念又有怎样不同的见解呢?
135 4
|
4月前
|
JSON 中间件 Go
Go语言实战指南 —— Go中的反射机制:reflect 包使用
Go语言中的反射机制通过`reflect`包实现,允许程序在运行时动态检查变量类型、获取或设置值、调用方法等。它适用于初中级开发者深入理解Go的动态能力,帮助构建通用工具、中间件和ORM系统等。
301 63
|
3月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
302 0
|
6月前
|
Go 持续交付 开发者
Go语言包与模块(module)的基本使用-《Go语言实战指南》
本章深入讲解Go语言中的包(Package)和模块(Module)概念。包是代码组织的最小单位,每个`.go`文件属于一个包,通过`import`实现复用;主程序包需命名为`main`。模块是Go 1.11引入的依赖管理机制,支持自动版本管理和私有/远程仓库,无需依赖GOPATH。通过实际示例,如自定义包`mathutil`和第三方模块`gin`的引入,展示其使用方法。常用命令包括`go mod init`、`go mod tidy`等,帮助开发者高效管理项目依赖。最后总结,包负责功能划分,模块实现现代化依赖管理,提升团队协作效率。
282 15
|
11月前
|
Linux Go iOS开发
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
本文介绍了如何在 VSCode 中禁用点击 Go 包名时自动打开浏览器跳转到 pkg.go.dev 的功能。通过将 gopls 的 `ui.navigation.importShortcut` 设置为 "Definition",可以实现仅跳转到定义处而不打开链接。具体操作步骤包括:打开设置、搜索 gopls、编辑 settings.json 文件并保存更改,最后重启 VSCode 使设置生效。
447 8
怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev
|
10月前
|
Go 数据库
Go语言中的包(package)是如何组织的?
在Go语言中,包是代码组织和管理的基本单元,用于集合相关函数、类型和变量,便于复用和维护。包通过目录结构、文件命名、初始化函数(`init`)及导出规则来管理命名空间和依赖关系。合理的包组织能提高代码的可读性、可维护性和可复用性,减少耦合度。例如,`stringutils`包提供字符串处理函数,主程序导入使用这些函数,使代码结构清晰易懂。
372 11
|
Go 索引
go语言使用strings包
go语言使用strings包
266 3
|
编译器 Go 开发者
go语言中导入相关包
【11月更文挑战第1天】
183 3
|
存储 Go 数据库
Go语言Context包源码学习
【10月更文挑战第21天】Go 语言中的 `context` 包用于在函数调用链中传递请求上下文信息,支持请求的取消、超时和截止时间管理。其核心接口 `Context` 定义了 `Deadline`、`Done`、`Err` 和 `Value` 方法,分别用于处理截止时间、取消信号、错误信息和键值对数据。包内提供了 `emptyCtx`、`cancelCtx`、`timerCtx` 和 `valueCtx` 四种实现类型,满足不同场景需求。示例代码展示了如何使用带有超时功能的上下文进行任务管理和取消。
131 0