GCTT - Go 中文翻译组

收录了 323 篇文章 · 259 人关注

  • Go 测试高级窍门和技巧

    2017 年 2 月 1 日 · 5 min 阅读 这篇文章基于我在 [维尔纽斯的 Golang 交流会](https://www.meetup.com/Vilnius-Golang/) 上的演讲。 我读了很多博客,看了很多演讲并把所有这些窍门和技巧都集中在一个地方。首先我想感谢那些提出这些想法并把它们分享到社区的人。我从下面的这些工作中借鉴了资料和示例: - [Andrew Gerrand - Testing Techniques](https://talks.golang....

  • 使用 Golang Goroutines 并发编程

    大家好!在这篇文章中,我们将介绍如何在基于 Go 语言的项目中使用***goroutines***,以及如何提升项目运行时的性能。 ## 视频教程 https://youtu.be/ARHXmR0_MGY ## 简介 如今,Go 是一种性能优良的程序设计语言,它拥有大量优秀的特性用于支持构建高性能的应用程序。它通过特有的***goroutines***和***channels***,重新定义了什么是构建高并发的项目。 使用***goroutines***可以快速地将...

  • 效仿 Golang 中的枚举类型

    在这篇博文中我们看到使用 `go generate` 和遍历抽象语法树来生成强大的枚举类型。 博文的结果是一个生成枚举类型的客户端。[全部代码](https://github.com/steinfletcher/gonum) 都可以在 Github 上面找到。 ## Go 惯用技巧 Go 并没有对枚举类型提供一流的支持。模拟枚举类型的一种方法是,将一系列相关的常量定义为一个新的类型。Iota 可用于预定义连续自增的整形常量。我们可以像下面这样定义一个 `Color` 类型。 ...

  • Go 语言中的快速检查测试

    本系列的前文: https://itnext.io/types-and-specifications-c4d34ade6d5c “我们只能看到我们了解的东西。”—— [Goethe](https://en.wikipedia.org/wiki/Johann_Wolfgang_von_Goethe) 在我的上一篇关于测试的文章里,我通过使用 Clojure 这门非静态类型的语言介绍了快速检查的概念。尽管我说要优先考虑基于规范的检查而不是指望类型系统能够确保程序的正确性,但你可能会发现自...

  • 对 Golang 代码调用 Elasticsearch 进行单元测试

    [Elastic client](https://github.com/olivere/elastic) 是一款很不错的针对 Go 语言的 Elasticsearch 客户端,在[Working With Elasticsearch](http://goinbigdata.com/working-with-elasticsearch-in-go/) 一文中,我用它举例解释了如何对文档建立索引并搜索文档。你如果希望代码能正常执行,不会被重构或者修改所影响,那么你必须要有一个能覆盖所有代码的测试用例...

  • 如何在 Golang 中为 RESTful 微服务创建健康检查

    想象一下,您最近发布并部署了一段很酷的 RESTful 微服务,您已经使用了一段时间。您松了一口气却听到 Ops 团队说您的服务不稳定。您真的很确定服务应该没问题,可能是它依赖的服务有问题。那该怎么办? 健康检查将来拯救你。它是您的服务返回状态的端点,包括您的服务直接依赖的所有外部服务的连接状态。在这篇文章中,我将展示如何为在多个节点上运行的微服务创建健康检查,该服务将其状态存储在 MongoDB 中并调用 Elasticsearch > 对你的服务应该监控外部服务,会感觉到非常诧异...

  • 调试使用 Go 1.12 发布的程序 — Go 官方博文

    ## 介绍 Go 1.11 和 Go 1.12 允许开发人员调试他们部署到生产环境中经过优化的二进制文件,并且在这方面有了重大改进。 由于 Go 编译器越来越致力于生成更快的二进制文件,在文件的可调试性方面却产生了短板。在 Go 1.10 中,用户需要完全禁用优化,才能从 Delve 等交互式工具中获得良好的调试体验。但是用户不应该为了可调试性而放弃性能,尤其是对于生产环境的服务。如果在生产环境中出现问题,则需要在生产环境中对其进行调试,而不是部署未经优化的二进制文件。 对于 ...

  • 60 秒搭建无服务 Golang 应用

    在这篇简短的文章中,我将说明使用 [Apex Up](https://github.com/apex/up) 对任何 Golang 应用程序或 API 是如何快速的生产出无服务环境的。这篇文章假设你在你的机器上配置了 [AWS credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html),因为 Up 是部署到 AWS Lambda 和 API 网关上的。 Up 适用于任何 Go ...

  • 使用 GoLand 进行调试的要点

    *由 [Florin Păţan](https://blog.jetbrains.com/go/author/florin-patanjetbrains-com/) 于 [2019 年 2 月 14 日 ](https://blog.jetbrains.com/go/2019/02/14/debugging-with-goland-essentials/) 发表* 在今天的帖子中,我们将继续探索 GoLand 中的调试器功能。如果你想知道如何配置调试器。请查看我们之前的帖子,其中包含关于如...

  • 使用 Goland 调试 - 起步

    *由 [Florin Pățan](https://blog.jetbrains.com/go/author/florin-patanjetbrains-com/) 发布于 2019 年 2 月 6 日* 调试是任何一个现代应用的生命周期中的必要部分。 对于经常使用调试器的开发者而言,调试不仅对于发现 bug 很有用,也有助于查看和理解他们即将用到的新代码库中发生了什么,或是学习一门新的语言到底是怎么回事。 一般来说,大家比较喜欢的调试风格有两种: * 打印语句:在代码执...

  • Go GraphQL 入门指南 - 第二部分

    ___注意___:关于 GraphQL 的系列教程的第一部分可以在这里:[Go GraphQL 入门指南 - Part 1](https://studygolang.com/articles/18801) 阅读。 首先,再次欢迎各位 Gophers !在本篇教程中,我们将在上一篇教程中所做的工作基础上进行扩展,了解变更 (Mutation) 的概念,并在 GraphQL API 后端实现合适的数据源。 在上篇教程中,我们了解到 GraphQL 的一些主要的优点,以及它是如何在应用程序...

  • 在 Go 中使用服务对象

    服务对象是 `Ruby on Rails` 中一个高度可用的模式,它能够保持控制器和模型简洁干净并从两者中删除域逻辑。在我看来,服务对象是单一责任原则以及通过依赖注入分配责任的一个很好的例子。 一般而言,`SOLID` 及其背后的理念允许编写可测试的代码,这对于更改非常灵活。`Robert "Uncle Bob" Martin` 推动了这些原则。`SOLID` 原理理论在 2000 年的论文 [`Design Principles and Design Patterns.`](https:...

  • Go 1.13 中值得期待的特性

    Go 1.13 的开发周期在五月初就要结束了,为了准备好未来 Go 2 的新特性,[新的进程](https://blog.golang.org/go2-here-we-come) 已经正式启动,这个进程主要由社区来负责驱动。 只要不会带来向后不兼容的问题,每个 Go 2 的提议都有可能会在更早的版本发布出来。总体而言,每个提议都应该: 1. 解决的是对大多数人来说很重要的问题。 2. 对所有其它的用户产生的影响最小。 3. 提供一个清晰并易于理解的解决方案。 至于 Go 1...

  • Go 的人脸识别教程 - 第一部分

    整个人脸识别领域是我喜欢阅读的内容。自己实现一个人脸识别系统会让你听起来像 Tony Stark 并且你可以将它们用于各种不同的项目,例如自动锁门,或者为你的办公室建立一个监控系统,仅举几例。 在此教程中,我们将使用 Go 中一些内置的库去构建自己的,非常简单的人脸识别系统。我们首先在静态图像上进行简单的人脸识别,并且看看它是如何工作的,然后我们将在这个小教程的第二部分拓展到成视频输入的实时人脸识别。 --- ## 视频教程 此教程以视频格式,如果您希望支持我和我的频道,...

  • 什么是协程(goroutine),它们是怎样工作的呢?

    ![image](https://raw.githubusercontent.com/studygolang/gctt-images/master/What-are-goroutines-And-how-do-they-actually-work/pic1.jpeg) 在过去的几年里,Go 语言能获得如此难以置信的流行度的一个主要原因,是 Go 能通过轻量级的 Goroutines 和 channel 更加简便地处理并发问题。 并发并不是什么新鲜事物,它一直以多线程的形式存在于我们几乎每...

  • 编写自定义准入控制器(Golang 版)

    Kubernetes API 是一个非常优秀的产品。由于是基于 REST 模型构建的,我们能够通过 HTTP 请求来管理我们的工作单元。类似于 `kubectl` 或者 `Kubernetes Dashboard` 这样的工具就充分地利用这个优势来帮助管理不同的资源。然而 Kubernetes API 能做的不仅仅是这些。让我们深入了解该组件是如何组成的。 ![1](https://github.com/studygolang/gctt-images/blob/master/creatin...

  • 调试 Go 的代码生成

    2016 年 10 月 15 日 *上周,我在 [dotGo](http://www.dotgo.eu/),参加一个最棒的 Go 会议,与大西洋彼岸的 Gopher 们相聚。我做了一个简短迅速的演讲,关于使用工具链中可用工具来进行代码生成的检查。这篇文章给没能参加会议的 Gopher 们过一遍演讲的内容。幻灯片在 [go-talks](https://go-talks.appspot.com/github.com/rakyll/talks/gcinspect/talk.slide) 也能找...

  • 在 Go 中使用 Websockets 和 Socket.IO

    > 注 - 本教程是使用 Go 1.9 版和 [googollee/go-socket.io](https://github.com/googollee/go-socket.io) 编写的 Websockets 我觉得非常有趣,在应用程序之间通信中使用标准 RESTful API 方案之外,它为我们提供了一个替代选项。使用套接字,我们可以做到成千上万个不同客户端之间的实时通信,而不必让每分钟数十万个 RESTful API 调用来轰炸我们的服务器。 ## 视频教程 [https...

  • Go 语言的并发性

    昨天,我在 Quora 上回答了一个关于 Go 语言并发模型的问题。现在,我觉得我还想再多说些什么!并发性是 Go 语言中最强大的特性之一。许多人讨论了这个话题,从非常简单到过于复杂的都有。今天,我也来说说我的看法。 Go 语言的并发性是一种思维方式而不仅仅是一个语法。为了利用 Go 的强大功能,你需要首先了解 Go 是如何实现代码的并发执行。Go 依赖于一个叫做 CSP(Comminicating Sequential Process 通信顺序进程)的并发模型,在计算机科学中,它基本上是...

  • 如何在 Golang 中使用 MongoDB 构建微服务

    如今,Golang 越来越流行于编写 RESTful 微服务。这些服务常常使用 MongoDB 作为持久性存储。在本文中,我们将使用 Go 和 MongoDB 构建一个简单的 *书店* 微服务。我们将使用 *mgo* 驱动程序连接 MongoDB,并使用 *curl* 测试微服务。 ## MongoDB MongoDB 以其简单、高可用性和面向文档的特性风靡市场。与关系型相比,文档化的优点是: + 文档化在许多编程语言中可以对应原生数据类型。 + 嵌入式文档和数组减少了对高昂...

  • Golang 中的依赖注入之使用更高阶的函数

    你可以找到一个完整的代码示例在[github.com/steinfletcher/func-dependency-injection-go](https://github.com/steinfletcher/func-dependency-injection-go)。例子包含了一个暴露 REST 接口的 http 服务器。 ## 简介 在这篇博文我们介绍一种 Go 中依赖注入的方式 -- 使用更高阶的函数和闭包。 考虑下以下返回用户资料的 domain 层函数。 ```g...

  • 120
    Go 中的 gRPC 简介

    *给使用 Go 语言的初学者的 gRPC 概述* ![grpc.png](https://raw.githubusercontent.com/studygolang/gctt-images/master/a-brief-introduction-to-grpc-in-go/grpc.png) ## RPC RPC 是用于 **软件应用之间点对点通信** 的 **网络编程模型** 或是 **进程间通信技术**。 RPC 是一种 **协议**,一个程序能够使用该协议,对位于另...

  • Go 中的缓存现状

    > 这篇文章登上了 Golang 在 Reddit [subreddit](https://www.reddit.com/r/golang/comments/az99sl/the_state_of_caching_in_go_dgraph_blog/) 板块的顶部,并在 [Hacker News](https://news.ycombinator.com/item?id=19344624) 首页排名到第二名。欢迎各位来阅读讨论,并在 [Github](https://github.com/dgr...

  • 优雅关闭的 Go Web 服务器

    在这篇博文里我想要给你们展示下,如何创建一个可以优雅关闭的 Go HTTP Web 服务器。通过这个方法可以让服务器在它真正关闭之前清理某些资源,( 例如 ) 想象下完成数据库事务或者一些其他长时间的操作。我们将会用到在我[关于并发的博文](https://marcofranssen.nl/concurrency-in-go/) 学习到的东西。所以,期待看到 channel 和 Goroutine 作为解决方法的一部分吧。 当我建立新的 http 服务器,我通常通过使用命令行标志提供端口号...

  • 使用 Go 和 LLVM 进行 Web Assembly 的高效前端开发

    我今天想分享一个非常酷的项目[tinygo](https://tinygo.org/) 经历。 首先让我说 Go 中的 Web Assembly 有一个大问题,它太过依赖于完成任务而定制的 API。在我看来 `syscalls/js` 是错误的使用 Web Assembly 方式: - Go 开发者不应该学习 JavaScript - 随着时间的推移,Web Assembly 将获得自己的 API,可能基于[WebIDL](https://github.com/WebAssembl...

  • Go 与 C# 对比 第一篇:Goroutines 与 Async-Await

    > 我将写一个系列的文章,来对比 C# 与 GO( 译者:就两篇 ),Go 的核心特性是 Goroutines, 这是一个非常棒的起点,C# 的替代方案是使用 Async/Await 来支持这个特性。 但是实现的方式上还是有一些差异的: * C# 中对于 Async/Await 的实现是基于编译器提供的方法体,类似于 C# 对 IEnumerable<T> / IEnumerator<T> methods 的实现。编译器生成一个方法返回状态,返回值作为是否异步计算的标志。 * Go...

  • Exceptions 和 Return

    前几天[Thiago Pontes](https://twitter.com/thiagopnts) 分享了一篇关于异常被认为是反模式的博客给他的几个朋友。我对异常有一个不同的观点。我想如果写一个关于 exceptions 的博客会非常的有趣。我认为异常是一个非常好的功能,如果缺少异常可能会引起更大的错误。 这篇博客引用了我朋友分享的帖子:[Python exceptions considered an anti-pattern.](https://sobolevn.me/2019/02/...

  • Go 的调度器追踪

    ## 简介 我喜欢 Go 语言的一个原因就是因为它可以生成分析和调试信息。当程序在执行的时候 Go 有一个特殊的环境变量 GODEBUG,它在运行阶段可以生成调试信息。你可以获取程序回收器和调度器的概要信息以及详细的信息。更主要的是你不需要添加任何的额外工作重新编译就可以完成调试 在这篇文章里,我将通过一个简单的 Go 程序演示如果使用调度跟踪信息。如果你对调度器有一定的了解那么它对你是用的。我建议先阅读下面两篇文章: 并发、goroutines 和 GOMAXPROCS ...

  • 使用 Go、Postgresql、JWT 和 GORM 搭建安全的 REST API

    在本教程中,我们将要学习如何使用 Go 语言开发和部署一个安全的 REST API ## 为什么用 Go Go 是一个非常有意思的编程语言,它是一个强类型的语言,并且它编译得非常的快,它的性能可以与 C++ 相比较,Go 还有 goroutine —— 一个更加高效版本的线程——我知道这些特性都不是什么新鲜的东西了,但我就是喜欢 Go 这个样子的。 ## 我们将要做个什么东西? 我们将要写一个通讯录的 APP,我们的 API 允许用户添加以及查看他们的联系人,这样当他们手...

  • Go 高级并发模式:第一部分

    写代码难,写处理并行和并发的代码更难!要做到这一切并保持高效将是极具挑战性的。 今天,我决定开始分享一些技巧来处理某些特殊情况。 ## 定时 Channel 操作 有时,你想要为你的 Channel 操作定时:持续尝试做一些事情,如果不能在一段时间内完成就放弃继续尝试。 要做到这一点,你可以使用 `context` 或者 `time`,两者都很好。`context` 可能更惯用,而 `time` 则更高效,但它们几乎是完全相同的: ```go func ToCha...

  • Go:切片陷阱

    ## 前言 我最喜欢 Go 的一个特性就是,毫无惊喜。某些程度上可以说有点无聊的感觉。这是编程语言的一个优秀的品质。这样的话,在编码的时候就可以专注于手头上的问题,而不是[语言做了你不希望它做的事情](https://twitter.com/chordbug/status/1092824183124488192?s=19)。 这篇文章有关 Go 的一个对新人来说最 "惊喜" 的特性 : slice。 ## 基本用法 如果你了解如何使用 Go slice, 请跳到下一节。 ...

  • 阅读挑战:Go 的堆排序

    ![image](https://raw.githubusercontent.com/studygolang/gctt-images/master/heap-sort-in-go/1_EGrh0TP0gMPgQc0rTVUPzg.jpeg) *<center> 一堆废旧汽车 </center>* 堆排序是一种漂亮的排序算法。它使用一个最大堆对一系列数字或其他定义了顺序关系的元素进行排序。在这篇文章里,我们将深入探究 **Go 标准库**中堆排序的实现。 ## 最大堆 Firs...

  • 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,但设置起来可能有点繁琐。我希望能够将这个过程完全自动化,...

  • 120
    仔细研究 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** 命令完成后,...