GCTT - Go 中文翻译组

收录了 277 篇文章 · 207 人关注

  • 使用 Delve 调试 Go 服务的一次经历

    > Vladimir Varankin 写于 2018/12/02 某天,我们生产服务上的几个实例突然不能处理外部进入的流量,HTTP 请求成功通过负载均衡到达实例,但是之后却 hang 住了。接下来记录的是一次调试在线 Go 服务的惊心动魄的经历。 正是下面逐步演示的操作,帮助我们定位了问题的根本原因。 简单起见,我们将起一个 Go 写的 HTTP 服务作为调试使用,这个服务实现的细节暂时不做深究(之后我们将深入分析代码)。一个真实的生产应用可能包含很多组件,这些组件实现了业...

  • 用 Go 创建一个新的智能合约语言 - 新项目动机,概念

    这篇文章讲述了 **为什么** 我们开始为智能合约创建新的编程语言(使用 Go)。 ## 动机 目前有两个众所周知的区块链,比特币和以太坊。比特币有 **bitcoin script** 和以太坊有 **solidity** 为它们自己的智能合约编程。两者都有利有弊。 对于 **比特币** 而言,它没有状态概念,并且 bitcoin script 是基于低级语言和很少的操作,因此它所能做的是有限的。另一方面,因为它的工作方式简单并且比特币是没有状态的,这样我们能轻松地进行静态分...

  • 使用 Prometheus 对 Go 应用程序进行监测

    监测服务级别的指标能让团队成员更清晰的看到你的程序表现如何,你的程序如何被使用,并且可以帮助定位潜在的性能瓶颈。 [Prometheus](https://prometheus.io/) 是一个开源的监测解决方案,原生的服务发现支持让它成为动态环境下进行服务监测的一个完美选择。Prometheus 支持从 [AWS, Kubernetes, Consul 等](https://prometheus.io/docs/prometheus/latest/configuration/config...

  • 将 CGO 与 Pkg-Config 和 自定义动态库位置一起使用

    我在这个月初写过一篇关于 Go 程序使用 C 动态库的文章。那篇文章构建了一个 C 语言动态库,并编写了一个使用该动态库的 Go 程序。但其中的 Go 代码只有动态库和程序在同一个文件夹下才能正确工作。 这个限制导致无法使用 **go get** 命令直接下载,编译,并安装这个程序的工作版本。我不想代码需要预先安装依赖或者在调用 go-get 之后执行任何脚本和命令才能正确运行。Go 的工具套件不会把 C 语言的动态库拷贝到 bin 目录下,因为我无法在 **go-get** 命令完成后,...

  • 在 Go 中使用 Mutex 与 Channel 进行状态同步

    我通过谷歌搜索查找哪种方法最适合 GoLang 的同步工作。当我开始构建自己的 GoLang 包 Go-Log 时,我就开始了这项工作。 Go-Log 是一个日志包,在 Go 的普通 Log 包之上提供实用程序,具有以下功能:将日志标记为调试和错误变体,向日志添加 / 删除时间戳以及在日志中获取调用功能详细信息。这就非常需要使这个日志记录线程安全,或者需要同步,因为当数百万个请求进入服务器日志时需要以较少的延迟同步。 通过浏览文章,StackOverflow 问答,以及常用的 Go 教学视...

  • 用 Golang 处理数据库迁移

    最近在 `r/reddit` 中不断出现 ***我如何使用 Go 来完成数据库迁移?*** 对于我和大多数人这种从其他语言例如 PHP 或是 Ruby 转到 Go 的人来说,数据库迁移在这些语言上已经不是什么问题了。例如 Ruby 的 Rails 和 PHP 的 Laravel。但我如何在 Go 中复制这种功能呢?同时考虑到框架是 Go 中的反模式这一事实。 举个例子,在在 Rails 和 Laravel 中可以非常轻松的使用 `bin/rails db:migrate` 或者 `php ...

  • Golang 中的标签(Tags in Golang)

    结构体字段的声明可以通过之后放置的文字来标记。标签添加由当前包或外部包使用的元信息。让我们首先回首一下 strcut 声明的样子,然后我们将扔出几个用例,深入研究这个标签。 ## 结构体类型(Struct type) Struct 是一系列字段。每个字段由可选名称和所需类型([源代码](https://play.golang.org/p/q2V_op8_SJk))组成: ```go package main import "fmt" type T1 struct { ...

  • Go 语言中一个模拟接口的工具

    ![image](https://raw.githubusercontent.com/studygolang/gctt-images/master/mock-interface/1_OC_uFaDoGfZ7s1Pkg8YbGg.png) 单元测试作为一种强大的工具,可以检查代码各个方面的行为。如果对进行代码测试十分重视,那么您将会一直编写可持续、可维护的代码,并且在代码的实现过程中保持代码的完整性。依赖于抽象的、经过开发者精心设计的代码是很容易进行测试的,所以代码的可测试性也作为其质量的一个指...

  • 深度剖析 Go 中的 Go 协程 (goroutines) -- Go 的并发

    > Go 协程 (goroutine) 是指在后台中运行的轻量级执行线程,go 协程是 Go 中实现并发的关键组成部分。 在上次的课程中,我们学习了 Go 的并发模型。由于 Go 协程相对于传统操作系统中的线程 (thread) 是非常轻量级的,因此对于一个典型的 Go 应用来说,有数以千计的 Go 协程并发运行的情形是十分常见的。并发可以显著地提升应用的运行速度,并且可以帮助我们编写关注点分离(Separation of concerns,Soc)的代码。 ## 什么是 Go 协程...

  • 如何发送和接收 SMS: 用 Go 语言实现 GSM 协议

    当开发者出于验证或者通知的目的想要为应用程序添加 短消息服务 组件时,通常会使用像 [Twilio](https://www.twilio.com/docs/sms/api) 提供的 RESTful API,但是 API 之下到底发生了什么呢? 在这篇文章,您将了解 [通用计算机协议(UCP)](https://wiki.wireshark.org/UCP) 是什么以及如何使用 Go 语言通过这个协议直接与 [短消息服务中心(SMSC)](https://en.wikipedia.org/...

  • 解析 Go context 通过 HTTP 的传播

    Go 1.7 引入了一个内置的上下文(context)类型。在系统中,可以使用 `context` 传递请求范围的元数据,例如不同函数,线程甚至进程之间的请求 ID。Go 将 `context` 引入标准库的初衷是以统一同一进程内的 context 传播。因此整个库和框架可以使用标准 context,同时可以避免代码碎片化。在引入该包之前,每个框架都在使用它们自己的 context 类型,并且没有两个 context 彼此兼容。在这种情况下传播当前 context 就要编写丑陋的胶水代码。 ...

  • 探索 Go 中字节解析 API

    很多年前,我开始研究 Linux 的 Netlink 进程间通信接口。Netlink 被用于从 Linux 内核检索信息,并且为了跨越内核边界,信息通常被打包到 Netlink 的属性中。经过一些实验,我为 Go 创建了自己的 [netlink 包](https://github.com/mdlayher/netlink)。 随着时间的推移,包中的 API 已经有很大的改变了。特别是 Netlink 属性总是处理起来相当复杂。今天,我们将探索一些我为处理 Netlink 属性所创建的字节解...

  • 利用 GoLand 和 Mozilla rr 项目来调试

    调试器。传统上,它们被用来发现复杂的 bug 并解释它们是如何发生的。但是,如果您无法解释为什么在步骤之间会发生一些更改,该怎么办呢?这就是典型调试器无法帮助您的地方,因为它们通常只会让您继续执行。 正如我们在前一篇文章中所看到的,虽然可以使用[核心转储](https://blog.gopheracademy.com/advent-2018/postmortem-debugging-delve/),但它们并不总是告诉您应用程序中发生的事情的全部情况。 输入可逆的调试器。这些调试器不仅...

  • 接口和反射的关系

    接口是 Go 中用于抽象的基本工具之一。接口在值进行分配的时候存储类型信息。反射则是在运行时检查类型和值的方法。 Go 通过 `reflect` 包实现了反射。该包提供了一些类型和方法用于检查接口结构部分,不仅如此,它还可以在运行时进行值的修改。 在这篇文章中,我希望能说明接口结构的各部分和反射 API 之间的关系,并最终使得反射包变得更加容易理解。 ## 向一个接口分配一个值 一个接口编码了三件事:值,方法集,以及所存储的值的类型。 下图展示了一个接口的内部结构。...

  • 迁移到 mod 只需 3 个步骤

    本文的目的是演示如何轻松地将带有 vendor 目录的旧项目迁移到使用 Go mod 的新项目。 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/migrating-to-go/1_a-NrrpFPmj-_JQGulalCdQ.png) 我不打算一一列举相对于使用依赖关系关联工具,使用 Go modules 的优势,因为在互联网上有几篇关于这方面的文章。另一方面,**我将指导您如何迁移项目**。...

  • SRE: 调试 Go 中简单的内存泄漏

    [内存泄漏](https://en.wikipedia.org/wiki/Memory_leak) 是一种即使当某块内存不再使用之后仍然没有被释放而产生的 bug。通常来说,它们是非常明显的,高度可见的,这使得它们成为学习程序调试的最佳选择。Go 是一门特别适合识别定位内存泄漏的语言,因为它有一套强大的工具链,这套工具链配备了非常强大的工具(*pprof*),它可以非常轻松地查明内存的使用情况。 我希望这篇文章能够演示如何直观地识别内存,并将其使用范围缩小至特定的进程内,将进程的泄漏与我们...

  • Go 中的 channel 解析— Go 中的并发性

    ## 什么是 channel ? **channel** 是一个通信对象,goroutine 可以使用它来相互通信。 从技术上讲,channel 是一个用于数据传输的管道,可以将数据**传入或从中读取**。 因此,一个 Goroutine 可以将数据发送到一个 channel ,而其他 Goroutine 可以从同一个 channel 读取该数据。 ## 声明一个 channel Go 提供 `chan` 关键字来创建一个 channel。channel 只能用于传输**一种数...

  • 120
    Go 和 WebAssembly: 在浏览器中运行 Go 程序

    很长一段时间以来,Javascript 是在 Web 开发者中的通用语言。如果你想写出一个稳定、成熟的 Web 应用程序,那么使用 Javascript 几乎是唯一的方法。 WebAssembly(也叫 wasm )即将改变这种情况。使用 WebAssembly,现在可以用*任何*语言来编写 Web 应用程序。在这篇文章当中,我们将明白怎样编写 Go 程序并使用 wasm 在浏览器中运行它们。 ## 首先,什么是 WebAssembly WebAssembly 官方网站 [we...

  • 120
    为什么会存在 Goroutines 泄漏,如何避免?

    在这个时代,软件程序和应用程序应该能够快速顺畅地运行。能够并行运行代码是当今满足这种需求的能力之一。但要注意泄漏的危险!我们将与来自[Ardan Labs](https://www.ardanlabs.com/) 的 Jacob Walker 讨论这个问题,他专门为 Golang 工程师撰写了这篇[博文](https://www.ardanlabs.com/blog/2018/11/goroutine-leaks-the-forgotten-sender.html)。 在开始阅读我们关于调...

  • 120
    Golang 和本地数据存储 - 快速灵活的数据存储

    如果要构建包含多个实例或者多个丰富数据模式的 Web 应用程序,本地数据存储可能不适用。但是在寻找真正的快速临时存储或者构建自己的副本的时候,本地存储却是需要了解的一个重要的组成模块。 在这篇文章中,我将展示如何在 Go 中使用 Memcached 协议来构建一个名为 Beano 的本地键 / 值对数据库服务器,并且该数据库可以优雅地热交换其整个数据集。 ## Go 数据存储类库的简单选择 我已经使用过 SQLite,BerkeleyDB 并了解 InnoDB,但出于种种原因,...

  • PHP 不会死 —— 我们如何使用 Golang 来阻止 PHP 走向衰亡

    在过去的十年中,无论是世界 500 强企业或是仅拥有 500 名用户的企业,我的团队都曾为他们开发过软件。在此期间,我的工程团队主要使用 PHP 进行后端开发。2 年前,我们在开发项目中引入了一些东西,这不仅彻底改变了我们产品的性能,也改变了它们的可扩展性————我们将 Golang 引入到我们的开发框架中。 很快,我们发现 Golang 的引用使得我们能够为客户设计更大型,速度提高 40 倍的应用程序。我们可以利用 Go 的强大功能来增强我们用 PHP 编写的产品,并充分利用这两种语言的...

  • 使用 Go 重构 - Goroutine 并发

    很意外,我这些天开始写 Go 了! 最近,我发现了一些使用简单的并发解决方案的代码。鉴于我已经使用过类似的模式,我得到的结论是,它应该是受基本 Goroutines 示例代码的启发。 ## 场景 假设你希望运行特定数量的任务,而这些任务很容易并行化 ( 没有副作用,没有外部依赖等等 ),并且希望存储每个任务的结果。Go 的解决方案就是使用多个 Goroutine。 我重构的真实代码是:通过调用 100 次 `net.LookupHost` 来计算系统中的平均 DNS 延迟...

  • Concurrency, Goroutines and GOMAXPROC

    William Kennedy 2014 年 1 月 29 日 ## 介绍 刚刚加入[GO-Minami](http://www.meetup.com/Go-Miami/) 组织的新人经常会说想学习更多有关 Go 并发的知识。并发好像在每个语言中都是热门话题,当然我第一次听说 Go 语言时也是因为这个点。而 Rob Pike 的一段 [GO Concurrency Patterns](http://www.youtube.com/watch?v=f6kdp27TYZs) 视频才让我真...

  • 深入理解 fmt 包

    我们经常会使用 `fmt` 包,但是却没有思考过它的实现。我们会在这里使用一个 `fmt.Printf`,又会在那里使用一个 `fmt.Sprintf`。但是,如果你仔细研究下这个包,你会发现很多有趣有用的东西。 由于 Go 在大多数情况下会用来编写服务器或服务程序,我们主要的调试工具就是日志系统。`log` 包提供的 `log.Printf` 函数有和 `fmt.Printf` 相同的语义。 良好且信息丰富的日志消息非常重要,并且如果为你的数据结构添加一些格式化的支持将会为你的日志消息...

  • 关于通用代码和特殊情况之间的冲突

    `io.Reader` 和 `io.Writer` 接口几乎出现在所有的 Go 程序中,并代表了处理数据流的基本构建块。Go 的一个重要特性是,对象如套接字、文件或内存缓冲区的抽象都是用这些接口表示的。当 Go 程序对外部世界说话的时候,它几乎是通过 `io.Reader`s 和 `io.Writer` s 来表达,无论它使用的是特殊的平台或通信媒介。这种普遍性是编码处理可组合和可重复使用的数据流代码的关键因素<sup><a href="#fn1" name="fnref1">1</a></su...

  • 使用 Golang 构建 DNS 服务器

    需求:对 DNS 查询进行转发和缓存的本地 DNS 服务器。 补充 1:提供一个记录管理的接口(HTTP handler)。 补充 2:提供一个名字(name)。 DNS 服务器的相关要点如下: - DNS 服务器把域名转换为 IP。 - DNS 主要使用 UDP 协议,其端口为 53。 - DNS 消息的长度最多为 512 字节,若超过这个长度,则必须使用 EDNS。 需要的组成部分有: - UDP - DNS 消息解析器(DNS message pa...

  • 120
    SRE: 性能分析: 一个 Go 编写的简单 HTTP Web 服务器的优化方法

    ​性能分析和调优是一种很强大的技术,用来验证是否满足客户关注的性能要求。性能分析常常被用来分析一个程序将大部分时间花在哪里了,并通过一个科学的方法来测试调优实践的效果。这个帖子使用一个 Go 语言编写的 HTTP 服务作为一个例子来定义一种性能分析和调优的普遍方法。go 特别适合性能分析和调优,因为它在它的标准库中提供了 [pprof](https://golang.org/pkg/runtime/pprof/) 剖析工具链。 ## 策略 我们先尝试建立一个简单的框架来构建对程序的分...

  • Go 中的对象的生命周期

    尽管 Go 语言很简单,Go 的开发人员仍然发现了许多创建和使用 Go 中对象的方法。在本篇博客中,我们将介绍对象管理的三步法 - ***实例化, 初始化,以及启动***。我们还会将其与其他的创建、使用对象的方法进行对比,并审查(评估)每种方法的优缺点。 ## 我们的目标 这似乎是一个愚蠢的问题,但是,我们在 Go 中创建和使用对象的目的到底是什么?为了与 Go 的风格的统一,我优先考虑了以下事项: * 足够简单 * 足够灵活 * 文档友好 除此之外,我们也应当说明哪...

  • 使用 golang-plugins 时要避免的事情

    我们正计划开源我们的项目。其中有一些关于授权逻辑的代码是我们公司高度定制的,我们需要在提供相同功能的情况下剔除掉这部分代码。并且,使任何人在实现自己的授权逻辑时,不需要重新编译所有代码。 ![img](https://raw.githubusercontent.com/studygolang/gctt-images/master/things_to_avoid_while_using_golang_plugins/1_X2zMAhjAP445suAyfvPUOw.png) 我们的代码...

  • Goroutine 泄露 - 被遗忘的发送者

    ## 引言 并发编程允许开发人员使用多个执行路径解决问题,并且通常用于提高性能。并发并不意味着这些多路径是并行执行的;它意味着这些路径是无序执行的而不是顺序执行。从历史上看,使用由标准库或第三方开发人员提供的库可以促进这种类型的编程。 在 Go 中,语言本身和程序运行时内置了 Goroutines 和 channel 等并发特性,以减少或消除对库的需求。这很容易在 Go 中编写并发程序时造成错觉。在你决定使用并发时必须要谨慎,因为如果没有正确使用它那么就会带来一些稀罕的副作用或陷阱。...

  • 使用 Go(Golang)实现 OAuth2.0

    2018 年 7 月 1 日 OAuth2 是一种身份验证协议,用于使用其他服务提供商来对应用程序中的用户进行身份验证和授权。 本文将介绍如何构建 Go 应用程序  来实现 OAuth2 协议。 > 如果您想查看代码,可以在[此处](https://github.com/sohamkamani/go-oauth-example) 查看 ## OAuth2 流程 在我们开始实现之前,让我们简要介绍一下 OAuth 协议。如果您曾经见过类似这样的对话框,那么您可能对 ...

  • 减少类型层次

    ## 介绍 我发现许多面向对象的编程语言(如 C #和 Java)的开发人员转向 Go 语言。 由于这些开发人员已接受过使用类型层次结构的培训,因此他们在 Go 中使用相同的模式是有道理的。 但是 Go 语言的某些方面,不允许类型层次结构提供与其他面向对象编程语言相同的功能级别。 具体来说,Go 中不存在基类和子类的概念,因此类重用需要不同的思维方式。 在这篇文章中,我将展示为什么类型层次结构在 Go 语言中使用,并不总是最佳模式。 我将解释为什么将具体类型组合在一起最好的办法,是通...

  • 理解 Go 语言中的指针和内存分配

    在 Go 语言官方文档中,你可以找到很多关于指针和内存分配的重要信息。以下是该文档的链接:[Go 语言官方文档之指针](http://golang.org/doc/faq#Pointers) 首先我们需要理解的是,所有在 Go 语言中的值都有其不同变量来表示。不同类型表示的变量决定了我们如何使用它来操纵内存。这篇文章阐述了更多关于 Go 语言中的变量类型:[理解 Go 中的类型](https://studygolang.com/articles/13976) 在 Go 中,我们可以创...

  • Go 面向对象编程

    今天有人在论坛上问我,怎么在不使用内嵌的方式下更好的使用继承。很重要的一点是,每个人都应当考虑 Go 而不是他们使用的其他语言。我不会告诉你我在 Go 的早期实现中删除了多少代码,因为这些都不重要。语言设计师拥有多年的经验和知识,事后审校有助于创建一个快速、精简而有趣的语言。 我认为 Go 是一个很不错的面向对象编程语言。诚然,它有封装和类型成员方法,但是它还是缺少继承和传统的多态性。对于我来说,继承用处不大,除非你想要实现多态。Go 实现了接口类型,所以继承就显得不那么重要了。Go 完成...

  • Go 语言中的错误处理 - 第二部分

    ## 简介 在 [第一部分](https://studygolang.com/articles/17169) 中,我们学习了 error 接口以及标准库是如何通过 errors 包来创建 error 接口值的。我们也学习了如何使用 error 接口值,通过这些值来判断是否发生了错误。最后,我们学习了一些标准库是如何通过导出 error 接口变量来帮助我们确定发生错误的具体类型。 在 Go 语言中什么时候应该使用自定义错误类型是比较难把握的。大部分情况下,error 包提供的 erro...

  • Go 语言中的错误处理 - 第一部分

    ## 简介 在 Go 语言中,如果一个函数或者方法需要返回任何错误,通常会使用 error 接口类型作为返回类型。在标准库中,所有返回了错误信息的函数和方法使用的都是这个接口。例如,下面是 http 包中 Get 方法的声明: 清单 1.1 http://golang.org/pkg/net/http/#Client.Get ```go func (c *Client) Get(url string) (resp *Response, err error) ``` ...

  • GO 中的调度:第三部分 - 并发

    ## 前奏 这篇文章是三部曲系列文章中的第三篇,这个系列的文章将会对 Go 中调度器背后的机制和语义做深入的了解。本文主要关注并发的部分。 Go 调度器系列文章: - [Go 中的调度器:第一部分 - 操作系统调度器](https://studygolang.com/articles/14264) - [Go 中的调度器:第二部分 - Go 调度器](https://studygolang.com/articles/15316) - [Go 中的调度器:第三部分 - 并发]...

  • Go Mock 测试

    ( 在开发的过程中 ) 你应该一直都写测试。不管使用什么语言,为了完全的理解如何能写出生产环境级别的应用,你应该拥有写单元测试的能力。有些人把测试驱动 (TDD) 做到极致。TDD 提倡你在写功能之前写测试。当你尝试写一些容易测试的代码的时候,这是个好方法。直到现在,我发现 TDD 很像 agile ( 敏捷软件开发 ); 很多人说他们有做测试驱动,但是实际中,他们只在一些混合的版本中做。到最后,它归根到底像,在吃牛排之前吃蔬菜的问题。( 西餐中 ) 比较健康的吃法是先吃蔬菜,然后吃牛排。就像在...

  • 用 Testify 来改善 GO 测试和模拟

    ## 目录 - [入门指南](# 入门指南 ) - [一个简单的示例](# 一个简单的示例 ) - [否定测试案例和 Nil 测试](# 否定测试案例和 -Nil- 测试 ) - [将 Testify 与表驱动测试相结合](# 将 -Testify- 与表驱动测试相结合 ) - [模拟](# 模拟 ) - [模拟示例](# 模拟示例 ) - [用 Mockery 生成模仿对象](# 用 -Mockery- 生成模仿对象 ) - [关键点](# 关键点 ) - [...

  • Go 测试介绍

    测试在所有软件中都非常重要,它能够确保代码的正确性,并确保你所做的任何更改,最终都不会破坏代码库中其他不同部分的任何内容,这一点非常重要。 通过花费时间来充分测试你的程序,可以让你自己开发得更快,并且有信心使你正在开发的项目发布到生产环境时,还可以持续的工作。 ## 视频教程 [YouTube https://youtu.be/GlA57dHa5Rg](https://youtu.be/GlA57dHa5Rg) ## 介绍 在本教程中,我们将关注如何开发并使用 `g...

  • Go 中接口值的复制

    我一直在思考 Go 语言它是如何工作的。直到最近我才发现 Go 中一切都是基于值的。当我们向函数传递参数、迭代切片、执行类型断言时我们都可以看到这一现象。在这些例子中,这些数据结构所存储的值的拷贝会被返回。当我刚开始学习 Go 的时候,我对于这种实现方式很失望,但渐渐地我开始意识到这样做对于我们的代码来说有它的合理性。 我开始在想,如果我创建了一个所存储的是值而非指针的接口类型的拷贝会发生什么。那么这个新的接口值会拥有自己新的副本值,还是共享原来的值?为了验证我的猜想,我写了一个小程序来检...

  • 在 Go 中实现并发性

    如果要我从 Go 的特性中选一个最棒的,那么必定是它内置的并发模型。Go 不仅支持并发,而且做的相当好。Go 语言并发模型和并发性的关系就好像是 Docker 和虚拟化一样。 ## 什么是并发? 在计算机编程中,**并发性是计算机同时处理多个任务的能力**。例如,如果您在浏览器中上网,同一时刻可能会发生很多事情。在特定情况下,你可能会在你**当前浏览的网页上**听歌的同时下载一些文件。因此浏览器需要能够同时处理很多事情。如果浏览器无法立即处理它们,您需要等到所有下载完成后再开始浏览互...

  • Go 语言中你应该知道的关于 Package 的所有

    *一个 Go 编程语言的包管理及应用的全面概述* 如果你对像 **Java** 或者 **NodeJS** 这样的语言熟悉,那么你可能对**包**(译者注:原文中 **packages** ,后文中将其全部译为中文出现在文章表述中)相当熟悉了。包不是什么其他的,而是一个有着许多代码文件的目录,它从单个引用点显示不同的变量(特征)。让我来解释一下,这是什么意思。 设想在某个项目上工作,你需要不断的修改超过一千个函数。这之中的一些函数有相同的行为。比如,`toUpperCase` 和 `toLo...

  • Go 方法(第二部分)

    这篇文章介绍了关于 Go 语言中方法的剩余部分。强烈建议先阅读[第一部分](https://studygolang.com/articles/14061) 的介绍部分。 ## 方法表达式 如果有这样一个类型 T,它的方法集中包含方法 M,则 T.M 会生成一个与方法 M 几乎相同且带有签名的方法,这称为 *方法表达式*。不同之处在于,它额外附带的第一个参数与 M 的接收者类型相等。 ```go package main import ( "fmt" "refle...

  • 用 gopher 的方式使用 panic

    Go 运行时(即成功编译后,操作系统启动该该进程)发生的错误会以 panics 的形式反馈。*panic* 可以通过这两种形式触发 : 1.直接使用内置 *panic* 函数: ```go package main func main(){ panic("foo") } ``` ``` > go install github.com/mlowicki/lab && ./bin/lab panic: foo goroutine 1 [running...

  • Go 编译器 nil 指针检查

    ## 简介 我在思考编译器是如何保护我们写的代码。无效的内存访问检查是编译器添加到代码中的一种安全检查。我们可能会认为这种“额外的代码”会损耗程序的性能,甚至可能需要数十亿的迭代操作。但是,这些检查可以防止代码对正在运行的系统造成损害。编译器本质上是指出和查找错误,使我们编写的代码在运行时更安全。 基于上述考虑,同时 Go 语言想要达成更快的编译速度,如果硬件可以解决这些问题,那么 Go 语言编译器就会使用硬件来解决问题。其中一种情况是检测无效的内存访问。有时编译器会在代码中添加 n...

  • 理解 Go 编程中的 slice

    自从我开始使用 Go 编程以来,slice 的概念和使用一直令人困惑。slice 看起来像一个数组,感觉就像一个数组,但它们不仅仅是一个数组,对我来说是一种全新的概念。我一直在阅读 Go 程序员如何使用 slice,我认为现在终于明白了 slice 的用途。 Andrew Gerrand 撰写了一篇非常棒的关于 slice 的博文: http://blog.golang.org/go-slices-usage-and-internals 没有理由重复 Andrew 所写的一切,...

  • Go 实现安全 cookie

    我第一次学习 Go 的时候,已经有了一定的 Web 开发经验,但是直接使用 cookie 的经验还比较少。我之前是用 Rails 的,在 Rails 里面如果要读/写 cookie,并不需要自己去实现所有的安全措施。 如你所见,Rails 偏向于通过默认配置就将大部分事情搞定。你不必去设置 CSRF 反制措施,或者做任何特殊操作来加密 cookie。在较新版本的 Rails 中这一切都默认帮你做好了。 用 Go 开发就完全不同了,这些事情并没有默认帮你做好。所以当你想使用 cooki...

  • Go 中的优雅升级

    优化升级背后的想法是在进程运行过程中,在用户无感知的情况下对程序的配置和代码进行更换(升级)。尽管这听起来很危险、容易出错、不可取,并且像是一个馊主意 - 事实上我(的想法)和你一样。 但是,有些时候你的确需要它们。这通常在一个没有负载均衡层的环境中会遇到这种问题。我们在 *Cloudfare* 也遇到了这种情况,这使得我们必须研究这类问题、并尝试、实现各类的解决方案。 ![](https://raw.githubusercontent.com/studygolang/gctt-image...

  • 在 Go 中使用 finalizers 比不使用更好

    Go 拥有 finalizers,它们支持程序调用一些代码并作为一个对象来进行垃圾回收。然而,很多人不太喜欢 finalizers,并且通常的建议是完全避免它们 ([比如](https://twitter.com/davecheney/status/790343722865090560))。最近,David Crawshaw 在[《Finalizers 惨案》](https://crawshaw.io/blog/tragedy-of-finalizers) 一文中指出 finalizers 的众...