好好学习,天天向上

golang 中使用了以下两个内置函数来处理错误和恢复: func panic(v interface{}): * 一旦调用: * 立刻停止执行函数其他代码 * 执行结束后,在当前 Goroutine 中递归执行调用方的延迟函数调用 defer * 允许在 defer 中嵌套多次调用 func recover() interface{}: * 用于中止 panic 造成的程序崩溃 * 只能在 defer 中发挥作用(只有在 panic 之后调用才生效) 基于 Go 1.14 数据结构 panic 关键字在 golang 中由数据结构 runtime._panic 表示: 1 2 3 4
阅读全文 »

以下基于 Go 1.14 Go 语言中的 defer 常用来进行资源释放。它有以下几个特点: * 向 defer 传入的函数会在当前函数或者方法返回之前运行。 * 函数中调用的多个 defer 会以先调用后执行的方式进行 * 在调用 defer 时,就会对函数传入的参数进行计算。 defer 类型 有三种类型的 defer 编译器的 ssa 过程中会确认当前 defer 的类型: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // compile.internal.gc.state.stmt func (s *state) stmt(
阅读全文 »

概述 对于函数调用,Go 语言使用调用者预先分配的栈来传递参数和返回值,使得多值返回成为可能。 以下基于 Go1.14 考虑以下代码: 1 2 3 4 5 6 7 8 9 package main func do(a, b int) (int, bool) { return a + b, a == b } func main() { do(33, 66) } 然后运行以下命令查看对应的汇编指令: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 $ go tool compile -
阅读全文 »

以下基于 go 1.14 基本使用 在 golang 中,内置函数 make 和 new 都是用来分配内存的。src/builtin/builtin.go 中对 make 和 new 的声明如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // The make built-in function allocates and initializes an object of type // slice, map, or chan (only). Like new, the first argument is
阅读全文 »

2016.03.07 ~ 2019.11.01。 这是我在 JG 待的日子。 这是我离开 HW 想当小码农后面的第一家公司。谁曾想,一待就是近四年。 那个时候,我对互联网公司都是咋玩的一点概念都没有。稀稀拉拉地学了一段时间的 python,刷了几道 leetcode,然后稀里糊涂地就进了 JG。后来,面试我的同事打趣道,要求不高,性别女,会写 hello workd 就行了。 在某些时候,幸运女神肯定是站在我身边的。 一入职,狂补知识。 Restful API 是啥?nginx+uwsgi 要咋用呀?RabbitMQ 是什么鬼东西?这个统计用 shell 咋写?Lua 半天从入门到
阅读全文 »

原文:Working with Errors in Go 1.13 介绍 Go 将错误视为值的这种行为在过去十年为我们服务良好。虽然标准库对错误的支持很少(只有 errors.New 和 fmt.Errorf 函数,它们产生仅包含消息的错误),但是内置的 error 接口允许 Go 程序员添加所需的任何信息。仅需一个实现 Error 方法的类型即可: 1 2 3 4 5 6 type QueryError struct { Query string Err error } func (e *QueryError) Error() string { retur
阅读全文 »

原文:Go - graceful shutdown of worker goroutines 在这篇博文中,我们将看看 Go 程序的优雅关闭。这类 Go 程序有一些执行任务的工作 goroutine,要求在程序关闭之前,这些工作 goroutine 必须完成任务。 介绍 在一个最近的项目中,我们有一个使用场景:一个基于 Go 的微服务不断地消费另一个第三方库发出的事件。这些事件在调用外部服务之前,会进行一些处理。而外部服务处理每个请求的速度都相当慢,但另一方面,它能够处理许多并发请求。因此,我们实现了一个简单的 worker 池,将输入事件扇出为几个并发执行的 goroutine。
阅读全文 »

在 Go 中,对于自定义结构的序列化和反序列化存在几个问题。 Q1:如何保证待反序列化的字符串只包含所定义的结构中的字段? 从 Go 1.10 起,标准库 encoding/json 提供了方法 func (*Decoder) DisallowUnknownFields。调用该方法表示,当目标是一个结构,并且输入流中包含任何不匹配该结构的非忽略的导出字段时,Decoder 会返回一个错误。 举个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package main import ( "encoding
阅读全文 »

原文:An Overview of Go's Tooling 偶尔会有人问我,“为什么你会喜欢用 Go 呢?” 在我的回答中,有一个我经常提到的原因,那就是和 Go 一起存在的那些好用的工具,并且它们是作为 go 命令的一部分存在的。其中有一些工具我每天都在用,例如 go fmt 和 go build。而其他像 go tool pprof 这样的工具,则只在解决特定问题的时候会用到。但是无论如何,我很感激它们,让我的项目管理和维护变得更加容易。 在这篇文章中,我希望说明一些我认为最有用的工具的背景和使用场景。更重要的是,解释清楚可以如何将其用于典型项目的工作流程中。如果你刚接触 Go
阅读全文 »