发布于 2018-03-21 星期三 这次的迭代有一些激动人心的改变。 特别是我用 Go 重写的整个程序。实际上我在这块没有花太多时间。这样带来的结果就是程序有点乱,虽然如此,我还是花几分钟来介绍下。首先,我来讲讲纹章的改变。 在最进一次迭代中只用 fess 和 pale (译者注:纹章学中的专业术语,标识徽章上面的竖线和横线图案,[详看维基](https://en.wikipedia.org/wiki/Pale_(heraldry))) 两部分,之后我添加了一些其余的基本元素:be...
-
纹章生成器(Heraldry Generation)第二部分:Go, 背景区域和符号
-
纹章生成器(Heraldry Generation)第一部分.基础
2018-3-12,星期一 不久之前,我开始在一个随机模拟环境构造器项目上工作,而纹章构造器只是该项目的最初的一部分。 它遵循构造器设计的部分原则:每一个部分只做一件事,做好,并且在整个项目的生态系统中能被共享。 所以在这个原则的指导下,徽章生成器诞生了:输出可以被编程的方式修改、能用必要的元数据给人类或机器描述内容的通用格式图像。 我选定 SVG 作为输出图片格式,主要是因为它是 XML 格式,很容易修改,相对来说体积更小,而且它是矢量图,在缩放的情况下不会失帧。 ...
-
Go 语言的数据结构 :栈与队列
在[先前的博文](https://studygolang.com/articles/12686)中,我们探讨了链表以及如何将它应用于实际应用。在这篇文章中,我们将继续探讨两个相似且功能强大的数据结构。 ## 建模操作和历史 让我们看看 Excel 或 Google 文档,他们是人类发明的最普遍的构成文件的应用程序。我们都使用过它们。 正如你可能知道的,这些应用程序有各种各样对文本的操作。 比如在文本中添加颜色、下划线、各种字体和大小,或者在表格中组织内容。这个列表很长,我们期望从这...
-
如何写 go 中间件
编写 go 中间件看起来挺简单的,但是有些情况下我们可能会遇到一些麻烦。 让我们来看一些例子。 ## 读取请求 我们例子中的所有中间件都会接收一个 `http.Handler` 作为参数,并返回一个 `http.Handler` 。 这样便于将中间件链接起来。我们所有的中间件将会遵循如下基本模式: ```go func X(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.Resp...
-
Go 实验报告:函数式编程之泛型
在 2017 年的年中,我在 GopherCon 上发表了《Go 的函数式编程》的演讲。我提出了一些函数式编程的概念,Gophers 使用它,可以提高编程效率,代码更加简洁。 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-experience-report-generics-for-functional-patterns/functional-programming-in-go.jpeg) ...
-
Go 语言中 append 导致内存不足
这是一篇简短的笔记,关于你或许会遇上的 Go 语言的内存不足的问题。 如你所知,Go 语言的 slice 很强大且使用简单。通过 Go 语言的内置函数,它可以解决我们许多问题。 但是今天,我更多想讲述的是 slice 与它的内存。 首先,创建 slice 最简单的方式是: ```go var sliceOfInt []int var sliceOfString []int var sliceOfUser []User var sliceOfMap []map[st...
-
代码中的缩进线
![我在2016年伦敦Golang英国会议上谈论代码缩进线](https://raw.githubusercontent.com/studygolang/gctt-images/master/line-of-sight/1_CBjBs9EzL8q1AL6XvjjpJg.png) 在近期伦敦举行的 [Golang 英国会议](https://www.youtube.com/watch?v=yeetIgNeIkc) 上,我在[地道的Go 语言窍门](https://www.youtube.co...
-
Go 中的复合字面量
![](https://raw.githubusercontent.com/studygolang/gctt-images/master/composite-literal/1_TM61VTlvvL2YWtI6UUYLOg.png) 在源代码中字面量可以描述像数字,字符串,布尔等类型的固定值。Go 和 JavaScript、Python 语言一样,即便是复合类型(数组,字典,切片,结构体)也允许使用字面量。Golang 的复合字面量表达也很方便、简洁,使用单一语法即可实现。在 Ja...
-
在 Golang 中尝试简洁架构
>(独立性,可测试性的和简洁性) 在阅读了 Bob 叔叔的 Clean Architecture Concept 之后,我尝试在 Golang 中实现它。我们公司也有使用相似的架构,[Kurio - App Berita Indonesia](https://kurio.co.id/), 但是结构有点不同。并不是太不同, 相同的概念,但是文件目录结构不同。 你可以在这里找到一个示例项目[https://github.com/bxcodec/go-clean-arch](https://git...
-
Go 语言的优点,缺点和令人厌恶的设计
这是关于 「[Go是一门设计糟糕的编程语言 (Go is not good)](https://github.com/ksimka/go-is-not-good)」 系列的另一篇文章。Go 确实有一些很棒的特性,所以我在这篇文章中展示了它的优点。但是总体而言,当超过 API 或者网络服务器(这也是它的设计所在)的范畴,用 Go 处理商业领域的逻辑时,我感觉它用起来麻烦而且痛苦。就算在网络编程方面,Go 的设计和实现也存在诸多问题,这使它看上去简单实际则暗藏危险。 写这篇文章的动机是因为我最...
-
Go 中的标签
`Label` 在 `break` 和 `continue` 语句中是可选参数,而在 `goto` 语句中是必传的参数。`Label` 只在声明它的函数中有效。只要函数中声明了 `Label` ,那它在该函数的整个作用域都有效。 ```go func main() { fmt.Println(1) goto End fmt.Println(2) End: fmt.Println(3) } ``` (注意!我们是在 goto 语句之后定义的 `Label`) ...
-
使用 Go 读取文件 - 概览
2017 年 12 月 30 日 2018 年 1 月 1 日:[更新](http://kgrz.io/reading-files-in-go-an-overview.html#update)(译注:在文章末尾) --- 当我开始学习 Go 的时候,我很难熟练得运用各种操作文件的 API。在我尝试写一个多核心的计数器([kgrz/kwc](https://github.com/kgrz/kwc))时让我感到了困惑 - 操作同一个文件的不同方法。 在今年的 [Adven...
-
创建和使用 HTTP 中间层(Making and Using HTTP Middleware)
在构建 Web 应用时,可能需要为许多(甚至全部)HTTP 请求运行一些公共的函数。你可能需要对每个请求进行记录,对每个响应进行压缩,或者在执行一些重要的处理之前检查一下缓存。 组织这种公共函数的一种方法是将其设置为中间层 - 自包含代码,它们在正常应用处理程序之前或之后,独立地处理请求。在 Go 中,使用中间层的常见位置在 ServeMux 和应用程序处理之间,因此通常对 HTTP 请求的控制流程如下所示: `ServeMux => Middleware Handler => Ap...
-
周五有感:失败,快速且猛烈
**摘要**:*在实现一个服务或 API 时,如果你收到一个你不太理解的请求,最友好的方式就是返回一个错误信息。* 让我们来考虑这样一个 API: `GET /mySum?num=3&num=42` 非常简单,是不是?我可能会这样来实现它: ```go func mySum(args url.Arguments, w http.ResponseWriter) { w.Write(int(args["num"][0]) + int(args["num"][1])) ...
-
不要对 I/O 上锁
锁可用于同步操作。但如果使用不当的话,也会引发显著的性能问题。一个比较常见出问题的地方是 HTTP handlers 处。尤其很容易在不经意间就会锁住网络 I/O。要理解这种问题,我们最好还是来看一个例子。这篇文章中,我会使用 Go。 为此,我们需要编写一个简单的 HTTP 服务器用以报告它接收到的请求数量。所有的代码可以从 [这里](https://github.com/gobuildit/gobuildit/tree/master/lock) 获得。 报告请求数量的服务看起来是这...
-
Go/Revel教程:在浏览器(使用 PaizaCloud IDE)上,构建 Go web 框架 Revel 的应用程序
![gopher](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-revel/20180323134353.png) Go 语言(golang)的特性有: - 标准库有很多功能,如网络。 - 易于编写并发程序。 - 易于管理可执行文件(因为只有一个文件) 由于这些特点,Go 语言在 web 开发中也越发受到欢迎。 如下图所示,我们可以在 Google Trends 看到 Go 受...
-
Golang 下的微服务 - 第 8 部分 - Kubernetes 和 容器引擎
[上一篇博文](https://studygolang.com/articles/12799) 我们看了看用 [Terraform](https://terraform.io/) 创建容器引擎集群。在本篇博文里,我们看看使用容器引擎和 [Kubernetes](https://kubernetes.io/) 部署容器到集群里。 ## Kubernetes 首先,什么是 [Kubernetes](https://kubernetes.io/) ? [Kubernetes](https:...
-
Go 语言中的类型断言
![](https://raw.githubusercontent.com/studygolang/gctt-images/master/type-assertion/1_p6c6i0niHNOIlRbsAhD3lA.jpeg) <center>[https://en.wikipedia.org/wikiPsycho_(1960_film)](https://en.wikipedia.org/wiki/Psycho_%281960_film%29)</center> 类型断言被用于检查接...
-
Go 语言汇编快速入门
在 Go 的源码中包含大量汇编语句,最优秀的示例代码位于 `math/big`, `runtime` 和 `crypto` 这些库中,但是从这里入门的话实在太过于痛苦,这些示例都是着力于系统操作和性能的运行代码。 对于没有经验的 Go 语言爱好者来说,这样会使通过库代码的学习过程遇到很大困难 。这也是撰写本文的原因所在。 Go ASM ( 译者注:ASM 是汇编的简写 ) 是一种被 Go 编译器使用的特殊形式的汇编语言,而且它基于 Plan 9 (译者注:来自贝尔实验室的概念[网络操...
-
使用 Go 语言写一个即时编译器(JIT)
JIT(Just-int-time) 编译器是任何程序在被转换成机器码的运行过程中产生的。JIT 代码和其他代码(比如,fmt.Println)的区别在于 JIT 代码是在运行过程中生成的。 用 Golang 编写的程序是静态类型且提前编译。生成任意代码似乎是不可能的,更不用说执行所述代码了。但是,可以将指令发送到正在运行的进程。这是使用 Type Magic 完成的 - 将任何类型转换为任何其他类型的能力。 请注意,如果您有兴趣了解更多关于 Type Magic 的信息,请在下面...
-
Golang 数据库 mocks(Golang database mocks)
我们[当前项目的核心](https://heupr.io/)是一个 [MemSQL](https://www.memsql.com/) 数据库,它是我们核心的数据管道;这是一个非常酷的技术,它的速度非常快,我们实在是太喜欢它了。但是,测试跟它相关的代码却有点困难,这个问题通过试验或者当遇到错误(主要是遇到错误)时,很快就可以发现。由于 Go 标准包已通过全面的测试,我只需要确保调用和依赖他们的代码在生产中也能够正常运行就好。 测试我们项目的数据库代码,我通过两个步骤完成。 通过 da...
-
在 Go 中导出标识符
包由单个目录内的源文件组成。 在这样的目录中,从不同的包中获取文件是非法的。 在 Go 中开始每个源文件的 Package 语句定义了文件所属的包: ```go package foo ``` > package 语句不是引入新标识符的声明,因此以后在源文件中不能使用 "foo"。 包的名称具有类似于常规标识符的语法。 所有共享相同包名的文件形成包。 为了使用来自其他包裹的标识符,需要 import 声明: ```go import "fmt" ``` ...
-
Go 语言之美
最近,我在做兴趣项目的时候开始探索 Go 语言,被 Go 语言的美征服了。 Go语言的美在于它在灵活使用(常见于一些动态,解释型语言)和安全性能(常见于一些静态,编译语言)之间有一个很好的平衡。 除此之外,还有另外的两个功能让我觉得 Go 语言非常适合现代的软件开发。我会在之下优势的部分阐述。 其中之一是 **对语言并发性的一流支持**(通过 `goroutine`,和 `channels` 实现,下面解释)。 并发,通过其设计,使您能够有效地使用您的 CPU 马力。 即使您的...
-
小函数可能是有害的(Small Functions considered Harmful)
在这篇博文中,我的目标是: - 揭示小函数的一些似是而非的优点 - 解释为什么我个人认为有点不像建议说的那么好 - 解释为什么小函数有时是适得其反 - 解释一下我认为小函数在 mock 中真正有用的地方 通常,编程建议总是说使用更优雅和有益的小函数。《Code Clean》被普遍认为是一本编程圣经,它有一章专门讲述函数,文章的开始就是介绍一个非常长,令人头疼的函数。该书认为该函数的最大问题是长度过长,并指出: 它(函数)不仅长度太长,而且有多处重复的代码,奇怪的字符串,许...
-
实现一个 Golang 调试器(第三部分)
到目前为止我们已经知道如何单步执行用 ptrace 暂停的进程(tracee)以及如何从二进制文件中获取一些调试信息(在[这里](https://studygolang.com/articles/12794)阅读相关内容)。接下来就是设置断点,等待程序运行到断点处,查看进程相关信息的时候了。 让我们从上一篇文章中用到的汇编代码开始 ```asm section .data msg db "hello, world!", 0xA len equ $ - ms...
-
接口不是值类型(Interface Values Are Valueless)
## 介绍(Introduction) 最近,在 Slack 上我看过大量关于接口的问题。大多数时候,答案都很有技术性,并都关注了实现的细节。实现(细节)对于调试很有帮助,但实现对设计却毫无帮助。当用接口来设计代码时,行为才是主要需要关注的。 在这篇博文中,我希望提供一个不同的思考方式,关于接口,和用他们进行代码设计。我想让你停止关注于实现细节,而是关注于接口和具体的数据的关系。 ## 面向数据设计(Data Oriented Design) 我相信写 Go 代码,应该用...
-
Golang 下的微服务 - 第 7 部分 - Terraform a Cloud
在之前的文章中,我们简要介绍了用户界面和Web客户端以及如何使用微工具包rpc代理与我们新创建的rpc服务进行交互。 本文将讨论如何创建云环境来托管我们的服务。 我们将使用 Terraform 在 Google Cloud 平台上构建我们的云群集。这应该是一篇相当短的文章,但它也很重要。 ## 为什么选择 Terraform? 我已经使用了几种不同的云供应解决方案,但对我而言,Hashicorps Terraform 感觉最容易使用并且得到最好的支持。近年来出现了一个术语:'基...
-
Golang 下的微服务 - 第 6 部分 - Web Clients
在之前的文章中,我们看了一些使用 go-micro 和 go 语言的生成的各种事件驱动的方法。 在本篇文章,我们将深入到客户端,探究一下如何创建一个能够与我们之前创建的平台交互的 Web 客户端。 这篇文章会介绍如何使用 [micro](https://github.com/micro/micro) 工具包生成 web 客户端从外部代理内部 rpc 方法。 我们会创建一个 user 接口用于生成平台的登录界面、还会创建一个接口用于使用我们的 consignments。该界面包含了创建...
-
Golang 中 strings.builder 的 7 个要点
自从 Go 1.10 发布的一个月以来,我多少使用了一下 `strings.Builder`,略有心得。你也许知道它,特别是你了解 `bytes.Buffer` 的话。所以我在此分享一下我的心得,并希望能对你有所帮助。 ## 1. 4 类写入(write)方法 与 `bytes.Buffer` 类似,`strings.Builder` 也支持 4 类方法将数据写入 builder 中。 ```go func (b *Builder) Write(p []byte) (int,...
-
剖析 go 语言的函数调用
让我们来看几个 go 函数调用的简单例子。通过研究 go 编译器为这些函数生成的汇编代码,我们来看看函数调用是如何工作的。这个课题对于一篇小小的文章来讲有点费劲,但是别担心,汇编语言是非常简单的,连 CPU 都能理解它。 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/anatomy-of-a-function/1_CKK4XrLm3ylzsQzNbOaroQ.png) *作者:Rob Baines...
-
实现一个 Golang 调试器(第二部分)
在[第一部分](https://studygolang.com/articles/12553)里,我们首先介绍了开发环境并且实现了一个简单的调试器(tracer),它可以使子进程(tracee)在最开始处停止运行,然后继续执行,并显示它的标准输出。现在是扩展这个程序的时候了。 通常,调试器允许单步执行被调试的代码,这个可以通过 [ptrace](http://man7.org/linux/man-pages/man2/ptrace.2.html) 的 PTRACE_SINGLESTEP 命...
-
Go 语言中提取字段和方法
struct 是一系列包含名称和类型的字段。通常就像这样: ```go package main import "fmt" type Person struct { name string age int32 } func main() { person := Person{name: "Michał", age: 29} fmt.Println(person) // {Michał 29} } ``` (在这篇博文的接下来部分,我将逐步删除包名、导入...
-
使用 defer 时可能遇到的若干陷阱
go 的 defer 语句对改善代码可读性起了很大作用。但是,某些情况下 defer 的行为很容易引起混淆,并且难以快速理清。尽管作者已经使用 go 两年多了,依然会被 defer 弄得挠头不已。我的计划是把过去曾困惑过我的一系列行为汇总起来,作为对自己的警示。 ## defer 的作用域是一个函数,不是一个语句块 一个变量只存在于一个语句块的作用域内。 defer 语句所在的语句块只会在函数返回时执行。我不清楚背后的原理,但是,如果你在一个循环里面先分配资源,再用 defer 回收...
-
Go 语言中的线程池(Thread Pooling in Go Programming)
用过一段时间的 Go 之后,我学会了如何使用一个不带缓存的 channel 去创建一个 goroutine 池。我喜欢这个实现,这个实现甚至比这篇博文描述的更好。虽然这样说,这篇博文仍然对它所描述的部分有一定的价值。 [https://github.com/goinggo/work](https://github.com/goinggo/work) ## 介绍(Introduction) 在我的服务器开发的职业生涯里,线程池一直是在微软系统的堆栈上构建健壮代码的关键。微软在 ....
-
Go 中值接收器构造器的探讨
在 Go 中,当涉及到面向对象编程,会有许多的前期工作需要做,以至于许多刚从其它语言迁移到 Go 的程序员会将那些语言中的一些概念带到 Go 中。对象构造器就是这么一个存在于许多其它语言中而无法在 Go 中找到的概念。 ## 为什么需要构造器 在 Go 中,有些对象需要初始化,比如 channel 和 slice 这两个很容易想到的例子。这个初始化的过程通过调用 `make` 函数来执行。 > make 这个内置函数为且仅为 slice, map 以及 chan 类型的对象分配...
-
Go 中的单例设计模式
多线程应用程序非常复杂,尤其是当你的代码没有组织并且与资源访问、管理和维护保持一致时。如果你想最大限度地减少错误,你需要哲学和规则来生活。这里有一些我的: - 资源的分配和回收应该在同一类型中抽象和管理 - 资源线程安全性应该在同一类型中抽象和管理 - 公共接口应该是访问共享资源的唯一手段 - 任何分配了资源的线程都应该释放同类型的资源 在 Go 中,没有线程,只有 `Go Routines`。Go 运行时抽象了这些例程的线程和任务交换。无论如何,相同的哲学和规则也适用。 ...
-
如何用 Go 语言实现正向代理
正向代理是处理一组内网客户端发往外部机器的网络请求的一种代理方式。 实际上,正向代理是你的应用和你所要连接的服务器之间的中间人。它在 HTTP(S) 协议上起作用,并且被部署在网络设施的边缘。 你通常可以在大型组织或大学中见到正向代理,它被用来进行授权管理或网络安全方面的控制。 我发现在使用容器或者动态的云环境工作时,正向代理很有用,因为你会面临一组服务器和外部网络的通信问题。 如果你在 AWS、AZure 之类的动态环境下工作,你会拥有一批数量不定的服务器和一批数量不定...
-
Go 反射机制介绍
反射是指一门编程语言可以在运行时( runtime )检查其数据结构的能力。利用 Go 语言的反射机制,可以获取结构体的公有字段以及私有字段的标签名,甚至一些其他比较敏感的信息。 众所周知Go标准库中有一些包利用反射机制来实现它们的功能。我们经常会以 [encoding/json](https://golang.org/pkg/encoding/json/) 包为例,该包常用来把 JSON 文档解析为结构体,同时也可以把结构体编码为JSON格式的字符串。 本文中我想给大家介绍一个略...
-
Golang 中的回环栅栏
这篇文章中我们会研究一个基本的同步问题。并使用 Golang 中原生的 Buffered Channels 来为这个问题找到一个简洁的解决方案。 ## 问题 现在假设我们我们有一堆 workers。为了充分发挥 CPU 多核的能力,我们让每个 worker 运行在单独的 goroutine 中: ```go for i := 0; i < workers; i++ { go worker() } ``` worker 需要做一系列的工作 job: ```g...
-
探索 Go 中的对象(object)
![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-object/goexplorer.png) 当我接受了 Go 根本没有 object 之后,我才开始更容易理解 Go 的 object 是什么,其实就是一些可以操作共有状态的函数集合,加了点语法糖的点缀。 你可能心想“闭嘴吧,Go 当然有 object”,或者想“能操作共有状态的函数集合就是 object 的定义啊”,好吧,也许你是对的。 ...
-
如何在 JAVA 中进行消息签名并在 GO 中进行验证
在我的公司中,我们使用 Java 和 Go 作为开发平台,当然有时候这些项目彼此之间会进行交互。在这篇文章中,我想要介绍我们的关于在 Java 端进行消息签名并在 Go 服务程序中进行验证的解决方案。 首先,我们聊一聊下面这个架构,我们的 Java 应用程序运行在云上新建虚拟机实例中,并且这个基础镜像实例包含了一个小的 Go 服务程序。这个服务程序是我们的配置管理系统的主入口,我们不希望有来自不可信的客户端可以修改节点。在请求中包含签名的双向 SSL 看起来足以信任客户端。但由于这两个组...
-
自动代码生成的 5 点建议
`//go:generate` 的引入使得 Go 语言在构建过程中集成自动代码生成工具更加简单。`stringer` 使得编写重复代码更轻松,而 `yacc` 和 `ragel` 这类程序则让优化解析器的生成变得可能。在 [GoGenerateTools](https://github.com/golang/go/wiki/GoGenerateTools) 上你可以找到关于这类工具的一份不完整的列表。 **给自动生成的代码做标记**。为了让构建工具能够识别出自动生成的代码,必须使用一个符合...
-
Go 语言的数据结构:链表
数据结构和算法是计算机科学的重要组成部分。虽然有时候它们看起来很吓人,但大多数算法都有简单的解释。同样,当问题能用算法来解释清楚的时候,算法的学习和应用也会很有趣。 这篇文章的目标读者是那些对链表感到不舒服的人,或者那些想要看到并学习如何用 Golang 构建一个链表的人。我们将看到如何通过一个(稍微)实际的例子来实现它们,而不是简单的理论和代码示例。 在此之前,让我们来谈谈一些理论。 ## 链表 链表是比较简单的数据结构之一。维基百科关于链接列表的文章指出: > ...
-
剖析与优化 Go 的 web 应用
Go 语言有一个很强大的内置分析器(profiler),支持CPU、内存、协程 与 阻塞/抢占(block/contention)的分析。 ## 开启分析器(profiler) Go 提供了一个低级的分析 API [runtime/pprof](https://golang.org/pkg/runtime/pprof/) ,但如果你在开发一个长期运行的服务,使用更高级的 [net/http/pprof](https://golang.org/pkg/net/http/pprof/) ...
-
Go 如何编写简洁测试 -- 表格驱动测试
表格驱动测试是一种编写易于扩展测试用例的测试方法。表格驱动测试在 Go 语言中很常见(并非唯一),以至于很多标准库<sup>[1](#reference)</sup>都有使用。表格驱动测试使用匿名结构体。 在这篇文章中我会告诉你如何编写表格驱动测试。继续使用 [errline repo](https://github.com/virup/errline) 这个项目,现在我们来为 `Wrap()` 函数添加测试。`Wrap()` 函数用于给一个 `error` 在调用位置添加文件名和行数的修...
-
Go 语言中的面向对象
![](https://raw.githubusercontent.com/studygolang/gctt-images/master/object-orientation/gophermessages.jpg) > 什么是面向对象呢? 这里我试着分享我对 go 语言如何实现面向对象的理解,以及让它看起来比其他传统的面向对象语言更加面向对象。 在之前的一篇文章中,我探讨了用函数来表达一切的想法,而实际上只是用一种安全的方式来表示一组函数,它总是与相同的闭包一起运行,并且可以在...
-
Go 执行追踪器(execution tracer)
## 概述 你有没有好奇过 Go 运行时是如何调度 goroutine 的?有没有深入研究过为什么有时候加了并发但是性能没有提高? Go 提供了执行跟踪器,可以帮助你诊断性能问题(如延迟、竞争或低并发等)、解决前面那些疑问。 Go 从 1.5 版本开始有执行跟踪器这么一个工具,原理是:监听 Go 运行时的一些特定的事件,如: 1. goroutine的创建、开始和结束。 2. 阻塞/解锁goroutine的一些事件(系统调用,channel,锁) 3. 网络I/O相关事件 ...
-
探索 vgo
昨天,Russ Cox 发布了 [vgo](https://research.swtch.com/vgo),作为一个现有 go 构建命令的继任者,添加了一直缺失的包版本管理功能。虽然它只是一个大胆的尝试,但是在大家都认为 [dep](https://github.com/golang/dep) 将要成为 Go 语言官方正式的包管理工具的时候,它的出现多少让大家有点意外。Russ 写的 [vgo 简介](https://research.swtch.com/vgo-intro) 和一起发布的 [v...
-
Go 中的等效类型
![cover](https://raw.githubusercontent.com/studygolang/gctt-images/master/identical-type/cover.jpg) [Go 语言中的可赋值性(Assignability in Go)](https://studygolang.com/articles/12381)的第一个例子提到: > 如果右边的类型和 T 等价,那么赋值是完全可以(进行)的。 这可能听起来不值一提,但是有一些细节(值得注意)。...
-
Go 的语句块
声明会给标识符绑定值,例如包、变量、类型等等。完成声明后,有必要知道源码中的标识符在哪些地方引用了被指定的值(简单来讲,就是一个标识符在哪里是可用的)。 Go 属于词法作用域,所以标识符的解析会依赖于它在代码中声明的位置。这种方式和动态作用域语言截然不同,动态作用域语言中标识符的可见性不依赖于被声明的位置。看看下面这段 bash 脚本: ```bash #!/bin/bash f() { local v=1 g } g() { echo "g sees v as ...