目录使用源码使用建议Go 语言标准库中的 log 包设计简洁明了,易于上手,可以轻松记录程序运行时的信息、调试错误以及跟踪代码执行过程中的问题等。使用 log 包无需繁琐的配置即可直接使用。本文旨在深入探究 log 包的使用和原理,帮助读者更好地了解和掌握它。使用先来看一个 log 包的使用示例:package main import "log" fun ......
271
0
0
2023-05-22
目录前言功能channel结构运行原理源码分析总结前言Go推荐通过通信来共享内存,而channel就实现了这一理念。那channel是怎么运行的呢?功能举个例子看下channel的使用效果:package main import ( "fmt" "math/rand" "time" ) func write(c chan ......
297
0
0
2023-05-22
目录为什么选择 Viper把配置值读入 Viper设置默认配置值从配置文件读取配置监控并重新读取配置文件从 io.Reader 读取配置从环境变量读取配置从命令行参数读取配置从远程 key/value 存储读取配置从 Viper 中读取配置值访问嵌套的键提取子树反序列化序列化序列化成字符串写入配置文件多实例对象使用建议总结Viper 是一 ......
299
0
0
2023-05-22
1.使用值为 nil 的 slice、 map 会发生啥允许对值为 nil 的 slice 添加元素,但绝对值为 nil 的 map 添加元素,则会造成运行迟缓 panic。 // map 错误示例 func main() { var m map[string]int m["one"] = 1 // error: panic: ass ......
312
0
0
2023-05-21
目录1. defer的简单介绍与使用场景2. defer在return执行的时机3. 小结1. defer的简单介绍与使用场景defer是Go里面的一个关键字,用在方法或函数前面,作为方法或函数的延迟调用。它主要用于以下两个场景:优雅释放资源,比如一些网络连接、数据库连接以及文件资源的释放。与recover配合处理panic异常场景一:复制文件func Co ......
294
0
0
2023-05-21
目录1. 概述1.1 什么是泛型1.2 Go 泛型的背景1.3 Go 泛型的特点2. 语法2.1 泛型函数2.2 泛型类型2.3 泛型约束2.4 泛型特化2.5 泛型接口2.5.1 泛型接口约束3. 泛型的常用场景3.1 排序3.2 搜索3.3 映射4. 总结Go 是一门旨在提高开发效率的语言,其简洁的语法和高效的运行速度让它成为了许多开发者的首选。然而,G ......
314
0
0
2023-05-20
目录1. Buffer 是什么2. 创建缓冲区2.1 使用 NewBuffer 函数创建2.2 使用 bytes.Buffer 结构体创建3. 写入数据4. 读取数据5. 截取缓冲区6. 扩容缓冲区7. 重置缓冲区8. 序列化和反序列化9. Buffer 的应用场景9.1 网络通信9.2 文件操作9.3 二进制数据处理9.4 字符串拼接9.5 格式化输出9. ......
322
0
0
2023-05-20
目录1. sync.Cond 的基本概念1.1 条件变量1.2 互斥锁1.3 条件变量的实现原理2. sync.Cond 的基本用法2.1 创建 sync.Cond 对象2.2 等待条件变量2.3 唤醒等待的 goroutine3. sync.Cond 的内部实现原理4. sync.Cond 的使用方法5. 总结Go 语言的 sync 包提供了一系列同步原语 ......
311
0
0
2023-05-19
最近翻开源代码的时候看到了一种很有意思的switch用法,分享一下。注意这里讨论的不是typed switch,也就是case语句后面是类型的那种。直接看代码:func (s *systemd) Status() (Status, error) { exitCode, out, err := s.runWithOutput("systemctl", "i ......
300
0
0
2023-05-19
目录1. 基本原理1.1 Context 包的介绍1.2 Context 的创建1.2.1 WithCancel1.2.2 WithDeadline1.2.3 WithTimeout1.2.4 WithValue2. Context 的使用场景2.1 并发控制2.2 超时控制2.3 数据库连接2.4 HTTP 请求2.5 gRPC 请求3. 总结1. 基本原 ......
266
0
0
2023-05-19
目录1.使用1.1示例1.2标志类型1.3标志语法2.源码解读2.1定义标志2.2解析标志参数2.3其他代码3.总结在使用 Go 进行开发的过程中,命令行参数解析是我们经常遇到的需求。而 flag 包正是一个用于实现命令行参数解析的 Go 标准库。在本文中,我们将深入探讨 flag 标准库的实现原理和使用技巧,以帮助读者更好地理解和掌握该库的使用方法。1.使 ......
271
0
0
2023-05-18
目录什么是死锁、活锁发生死锁的案例分析发生活锁的案例分析什么是死锁、活锁什么是死锁:就是在并发程序中,两个或多个线程彼此等待对方完成操作,从而导致它们都被阻塞,并无限期地等待对方完成。这种情况下,程序会卡死,无法继续执行。什么是活锁:就是程序一直在运行,但是无法取得进展。例如,在某些情况下,多个线程会争夺同一个资源,然后每个线程都会释放资源,以便其他线程可以 ......
284
0
0
2023-05-18
目录1. 基本数据类型1.1 整数型1.2 Golang 提供了两种浮点型数据类型:1.3 布尔型1.4 字符型1.5 字符串型2. 复合数据类型2.1 数组2.2 切片2.3 字符串2.4 映射2.5 结构体3. 总结在计算机编程中,数据类型是非常重要的一个概念。数据类型决定了计算机内部如何表示数据,以及在执行不同的操作时需要进行哪些转换。Go 语言作为一 ......
292
0
0
2023-05-18
目录1. 时间的表示2. 时间的计算3. 时间的比较4. 定时器和 Ticker5. 时区和时间格式化6. 定时任务7. 总结1. 时间的表示Go 语言中时间的表示方式是通过 time.Time 结构体来表示的。time.Time 类型代表了一个时刻,它包含了年月日时分秒和纳秒等信息。我们可以使用 time.Now() 函数获取当前时间,或者使用 time. ......
291
0
0
2023-05-18
目录0 知识背景0.1 WaitGroup0.2 信号量(Semaphore)1 WaitGroup 底层原理1.1 定义1.1.1 noCopy1.1.2 state atomic.Uint641.1.3 sema uint321.2 Add(delta int)1.2 Done()1.3 Wait()2 结语0 知识背景在进入正文前,先对 WaitGro ......
281
0
0
2023-05-16