![image](https://raw.githubusercontent.com/studygolang/gctt-images/master/heap-sort-in-go/1_EGrh0TP0gMPgQc0rTVUPzg.jpeg) *<center> 一堆废旧汽车 </center>* 堆排序是一种漂亮的排序算法。它使用一个最大堆对一系列数字或其他定义了顺序关系的元素进行排序。在这篇文章里,我们将深入探究 **Go 标准库**中堆排序的实现。 ## 最大堆 Firs...
-
阅读挑战:Go 的堆排序
-
Go 语言中的组合
组合超越了[嵌入式](https://www.ardanlabs.com/blog/2014/05/methods-interfaces-and-embedded-types.html) 结构。这是我们可以用来设计更好的 APIs 并通过较小的模块构建更大的程序的范式。这一切都是从单一目类型的声明和实现开始。程序在架构时考虑到组合能更好的扩展和适应不断变化的需求。它们能更容易阅读和推理。 为了证明这个观点,我们来评审下面的程序: ## [示例代码](https://github.co...
-
Go Modules 的使用方法 —— Go 官方博文
## 简介 Go 1.11 和 1.12 引入了[对 modules(模块)的初步支持](https://golang.org/doc/go1.11#modules),这是一个能让依赖项的版本信息更加明确和易于管理的依赖管理系统。本文旨在为你使用模块提供基本的操作指导。后续会有一篇文章来说明如何发布一个模块以供别人使用。 一个模块是一系列 [Go 代码包](https://golang.org/ref/spec#Packages) 的集合,它们保存在同一个文件树中。文件树的根目录中包...
-
通过 Docker 和 Go 实现 https 访问
![title](https://raw.githubusercontent.com/studygolang/gctt-images/master/Automagical-HTTPS-with-Docker-and-Go/1_3VNZrkS-sVUaa-xJQMXCnA.jpeg) 最近一直在构建很多 Webhook,通常我需要通过 HTTPS 协议为应用程序提供服务。快速实现这一目标的一种常见方法是使用 Let's Encrypt,但设置起来可能有点繁琐。我希望能够将这个过程完全自动化,...
-
仔细研究 Go(golang) 类型系统
通过示例详解 Go 的类型系统 让我们从一个非常基本的问题开始吧! ## 为什么我们需要类型 在回答这个问题之前,我们需要先看看编程语言的一些原始抽象层,日常的工作我们并不需要处理这些层。 ### 我们如何才能获得数据的机器表示呢? ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/A-Closer-Look-at-Go-Type-System/binary_zero_one.j...
-
用 Go 创建一个新的智能合约语言 - 词法分析器部分
这是用 Go 创建新的智能合约语言项目的第二篇文章。在上一篇文章中,介绍了项目的概念,为什么我们决定去构建新的智能合约语言和简要的架构。这个项目就是 WIP 并且开放了源码,你可以在 [这里](https://github.com/DE-labtory/koa) 访问它并随时向我们做出贡献。 - **前面的文章:** [**新语言概念,目标,架构**](https://studygolang.com/articles/17960) ![koa architecture](https:...
-
Go GraphQL 入门指南
欢迎各位 Gophers !在本教程中,我们将探索如何使用 Go 和 GraphQL 服务进行交互。在本教程完结之时,我们希望你可以了解到以下内容: - GraphQL 的基础知识 - 使用 Go 构建一个简易的 GraphQL 服务 - 基于 GraphQL 执行一些基本的查询 在本篇教程中,我们会专注于 GraphQL 在数据检索方面的内容,我们将会使用内存数据源来存储其数据。同时,本篇教程的内容将会为我们之后的教程提供一个良好的基础。 ## GraphQL 的基础知识...
-
Golang 中迭代读取 channel
欢迎再次来到我的 Go 语言私人教学课堂,今天我们的主题是,我曾经很难理解的 ( 还好现在已经理解了 ):在 Go 程中迭代读取 `channels`。 在开始之前,让我们先回忆一下。我们都知道,一个 Go 程的存活周期是建立在 main 进程之上的,举个例子: ```go package main import "fmt" func main() { go func() { fmt.Println("hello there") }() } ``` ...
-
Go 装饰器模式教程
装饰器在其他编程语言(如 Python 和 TypeScript)中肯定更为突出,但这并不是说你不能在 Go 中使用它们。事实上,对于某些问题,使用装饰器是完美的解决方案,通过本教程中我们可以了解到装饰器的用法。 ## 了解装饰器模式 > 装饰器本质上允许您包装现有功能并在开始或结尾处添加您自己的自定义功能。 在 Go 中,函数被视为第一等对象,这实际上意味着您可以像传递变量一样传递它们。我们来看一个非常简单的例子: ```go package main impo...
-
在 Go 中构建网络命令行界面
在本文中,我们将使用 `Github` 上提供的软件包 `urfave/cli` 在 Go 中构建一个非常简单的命令行界面,软件包位于 https://github.com/urfave/cli。 我最近在各种托管服务提供商中进行了一次或两次域名迁移,并认为构建一个可用于查询网站名称服务器,CNAME,IP 地址等内容的工具或程序是一个很酷的主意。 本教程的总体目标是让您了解如何构建自己的 CLI,这些 CLI 可以执行各种其他操作,例如网络监视,图像处理等。 > 注 - 可在...
-
Go 语言测试进阶教程
你好啊各位码农们!在这个教程中,我们将介绍一些进阶的测试实践,很多 Go 语言的核心开发人员以及流行的生产级工具都使用到了它们。 我希望这种通过生产上真实使用的案例来讲解的方法。能够给你一些启示,让你深入了解怎么去测试你自己的生产级别的 Go 程序。 > 注意:如果你对如何测试 Go 语言的程序完全不了解的话,我建议你先看看之前的教程: > [an introduction to testing in Go](https://tutorialedge.net/golang/intr...
-
深入理解 Go 语言中的 Testable Examples
隐藏的 `ast` 和 `parser` 包的介绍 2016 年 10 月 10 日 Golang 的工具链实现了名为 `Testable Examples` 的功能。如果对该功能没有什么印象的话,我强烈建议首先阅读[“ Testable Examples in Go ”](https://blog.golang.org/examples) 博文进行了解。通过这篇文章我们将了解到该功能的整个解决方案以及如何构建其简化版本。 让我们看看 `Testable Examples` 的...
-
Go 语言的 Stack Trace
## 简介 拥有必要的 Go 语言调试技巧能让我们在定位问题的时候节省大量的时间。我认为尽可能地记录下详尽的日志信息是一个很好的实践,但是有时候单单记录下错误是不足够的。正确的理解 stack trace(堆栈轨迹)的信息能让你准确地定位到 bug 的所在,避免出现日志记录不够,需要添加更多跟踪日志,然后等待 bug 重现的窘境。 我在开始编写 Go 程序的时候就已经开始了解 stack trace 方面的知识。我们有时会写错代码,使得 Go 运行时 panic 掉我们的程序并抛出一...
-
为什么要学习更多的编程语言
![page head](https://raw.githubusercontent.com/studygolang/gctt-images/master/why-need-to-learn-mpl/1.jpg) ## 我与编程语言的开放式关系 迄今为止我已经编程四年了。从开始的基于 C# 的游戏开发,然后使用 python 处理机器学习。学习使用 Javascript 以及 Typescript 做前端工作。后来想要做移动端应用,所以又学习了 Ionic,React,React Naive...
-
怎样成为一个优秀的开源社区成员
我的一个朋友是一个非常有天赋的作家。最近对于开源感兴趣,并且请我帮她了解如何成为一名优秀的开源社区成员。 开源是世界上最不寻常的事情之一。世界上是否还有还有其他行业,高技能的专业人士愿意将其空闲时间致力于免费公开他们的工作吗?很多人在日常工作中花费了大量的时间,只是为了度过他们的夜晚和周末,并且做同样的事情。 我已经参与开源工作近 20 年了---- 我开创了很多基于社区的成功的项目([Hugo](http://gohugo.io/), [spf13-vim](http://vi...
-
使用 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 只能用于传输**一种数...
-
Go 和 WebAssembly: 在浏览器中运行 Go 程序
很长一段时间以来,Javascript 是在 Web 开发者中的通用语言。如果你想写出一个稳定、成熟的 Web 应用程序,那么使用 Javascript 几乎是唯一的方法。 WebAssembly(也叫 wasm )即将改变这种情况。使用 WebAssembly,现在可以用*任何*语言来编写 Web 应用程序。在这篇文章当中,我们将明白怎样编写 Go 程序并使用 wasm 在浏览器中运行它们。 ## 首先,什么是 WebAssembly WebAssembly 官方网站 [we...
-
为什么会存在 Goroutines 泄漏,如何避免?
在这个时代,软件程序和应用程序应该能够快速顺畅地运行。能够并行运行代码是当今满足这种需求的能力之一。但要注意泄漏的危险!我们将与来自[Ardan Labs](https://www.ardanlabs.com/) 的 Jacob Walker 讨论这个问题,他专门为 Golang 工程师撰写了这篇[博文](https://www.ardanlabs.com/blog/2018/11/goroutine-leaks-the-forgotten-sender.html)。 在开始阅读我们关于调...
-
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...
-
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...