包含标签 go 的文章

为什么要使用 go module proxy

在看过 Go module 的简介之后,我以为我已经知道了这个功能我需要知道的一切。但是很快,我意识到并不是这样。最近,人们开始提倡使用 Go module proxy。在研究了利弊之后,我得出结论,这将是近年来 Go 语言最重要的变化之一。 但为什么会这样呢?是什么让 Go module 代理如此特别? 使用 Go modules 时,如果向干净的缓存的计算机……

阅读全文

无缓冲和有缓冲通道

Go 中的通道(channel)机制十分强大,但是理解内在的概念甚至可以使它更强大。实际上,选择缓冲通道或无缓冲通道将改变应用程序的行为和性能。 无缓冲通道 无缓冲通道是在消息发送到通道时需要接收器的通道。声明一个无缓冲通道时,你不需要声明容量。例如: package main import ( "sync" "time" ) func main() { c := make(chan string) var wg sync.WaitGroup wg.Add(2)……

阅读全文

go map 无序原因

连续两次被问到 map 遍历输出无序的原因 看过数据结构的我自信的回答:应为底层是散列表,没有顺序表内存上的连续,也没有链表逻辑上的前后继关系。 面试官笑得很诡异,而且就到此为止了。 直到我看到这段代码: ... // decide where to start r := uintptr(fastrand()) if h.B > 31-bucketCntBits { r += uintptr(fastrand()) << 31 } it.startBucket = r & bucketMask(h.B) it.offset = uint8(r >> h.B & (bucketCnt - 1)) // iterator state it.bucket = it.startBucket 遍历过程中……

阅读全文

goroutine 协程数目限制

协程属于用户态线程,逻辑由用户代码控制。 系统本身不对 goroutine 数目进行限制。 虽然 golang 中协程开销很低,但是在一些情况下还是有必要限制一下协程的开启数,如果你的协程数太过庞大,可能出现: 系统资源占用率不断上涨 输出一定数量后:控制台就不再刷新输出最新的值了 信号量:signal: killed 解决方式: buffered channel +……

阅读全文

Defer Recover Panic 三剑客

recover() 用于将 panic 的信息捕捉。 recover 必须定义在 panic 之前的 defer 语句中。 在这种情况下,当 panic 被触发时,该 goroutine 不会简单的终止,而是会执行在它之前定义的 defer 语句。 不再执行 panic 之后的语句 总之 使用时 recover 和 defer 搭配,就是三件套 panic->defer->recover 坑 函数嵌套后,defer 嵌套后就不管用 recover 必须放在 defer 中,否则只返回 nil 工作中没实际用过,有空补充点……

阅读全文

Defer 总结

虽说比较常用,但是遇到一道面试题还是比较懵逼,总结一下~ 面试题 下面代码输出什么? package main import "fmt" func calc(index string, a, b int) int { ret := a + b fmt.Println(index, a, b, ret) return ret } func main() { a := 1 b := 2 defer calc("1", a, calc("10", a, b)) a = 0 defer calc("2", a, calc("20", a, b)) b = 1 } /* output 10 1 2 3 20 0 2 2 2 0 2 2 1 1 3 4 */ 关键知识点 defer 是什么? defer 是 Go 语言提供的一种用于注册延迟调用的……

阅读全文

现代垃圾收集策略 —— Go 的 GC 策略

在 Hacker News 和 Reddit 你可以找到相关讨论 我最近看过很多文章,它们以令我困扰的方式推广 Go 语言最新的垃圾收集器。其中一些文章来自 Go 官方项目本身。他们声称这意味着 GC 技术已经有根本性的突破。 这是新版本(Go 1.5)垃圾收集器的首次公告: Go 正在构建一个垃圾收集器(GC),不止适用于 2015 年,甚至适用于 2025 年……

阅读全文

Vet 命令:超出预期的强大

Go vet 命令在编写代码时非常有用。它可以帮助您检测应用程序中任何可疑、异常或无用的代码。该命令实际上由几个子分析器组成,甚至可以与您的自定义分析器一起工作。让我们首先回顾一下内置的分析器。 内置分析器 可以通过命令 go tool vet help 获取 内置分析器 列表。让我们分析一些不太明显的例子,以便更好地理解。……

阅读全文

Go:关于 Cobra 的想法

Cobra 是 Golang 生态系统中最着名的项目之一。它简单,高效,并得到 Go 社区的大力支持。让我们来深入探索一下。 设计 Cobra 中的 Command 是一个具有名称,使用描述和运行逻辑函数的结构体: cmd := &cobra.Command{ Run: runGreet, Use: `greet`, Short: "Greet", Long: "This command will print Hello World", } 设计非常类似于原生的 go 标准库命令,如 go env,go fmt等 比如,go fmt 命令结构: var CmdFmt = &base.Command{ Run: runFmt,……

阅读全文