• 如何写好 Go 代码

    我写了多年的 Go 微服务,并在写完两本关于 ([API Foundations in Go](https://leanpub.com/api-foundations) 和 [12 Factor Applications with Docker and Go](https://leanpub.com/12fa-docker-golang)) 主题的书之后,有了一些关于如何写好 Go 代码的想法 但首先,我想给阅读这篇文章的读者解释一点。好代码是主观的。你可能对于好代码这一点,有完全不同的想...

  • Golang Http 服务的优雅重启

    (2015 年 4 月更新):[Florian von Bock](https://github.com/fvbock) 已将本文中描述的内容实现成了一个名为[Endless](https://github.com/fvbock/endless)的 Go 程序包。 对于 Golang HTTP 的服务,我们可能需要重启来升级或者更改某些配置。如果你(像我曾经一样)因为网络服务器对优雅重启很重视就理所当然地认为它(优雅重启)早已实现了,那么这份教程将会对你很有用处。因为在 Golang 中,...

  • 120
    Go: 监控模式

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-monitor-pattern/1.png) Go 能实现[监控模式](https://en.wikipedia.org/wiki/Monitor_%28synchronization%29),归功于 `sync` 包和 `sync.Cond` 结构体。监控模式允许 goroutine 在进入睡眠模式前等待一个定特定条件,而不会阻塞执行或消耗资源。...

  • 120
    Go:Context 和传播取消

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/context-and-cancellation-by-propagation/image_1.png) [context 包](https://blog.golang.org/context)在 Go 1.7 中引入,它为我们提供了一种在应用程序中处理 context 的方法。这些 context 可以为取消任务或定义超时提供帮助。通过 conte...

  • Golang <-time.After()在计时器过期前不会被垃圾回收

    最近我在调查 Go 应用程序中内存泄漏的问题,这个问题主要因为我没有正确的阅读文档。这是一段导致消耗了多个 Gbs 内存的代码: ```go func ProcessChannelMessages(ctx context.Context, in <-chan string, idleCounter prometheus.Counter) { for { start := time.Now() select { case s, ok := <-in: if !...

  • Go 实现百万 WebSocket 连接

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/a-million-websocket-and-go/image_1.jpeg) 大家好!我是 Sergey Kamardin,是 Mail.Ru 的一名工程师。 本文主要介绍如何使用 Go 开发高负载的 WebSocket 服务。 如果你熟悉 WebSockets,但对 Go 了解不多,仍希望你对这篇文章的想法和性能优化方面感兴趣。 ...

  • 使用 Go 和 ReactJS 构建聊天系统(六):Docker 部署

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-6) > 本文是关于使用 ReactJS 和 Go 构建聊天应用程序的系列文章的第 6 部分。你可以在这里找到第 5 部分 - [优化前端](https://studygolang.com/articles/22433) 在本节中,我们将专注于将 Docker 添加到后端应用程序中。 为什么要这么做呢?在我们研究诸如身份验证...

  • 使用 Go 和 ReactJS 构建聊天系统(五):优化前端

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-5) > 本文是关于使用 ReactJS 和 Go 构建聊天应用程序的系列文章的第 5 部分。你可以在这里找到第 4 部分 - [处理多个客户端](https://studygolang.com/articles/22430) 欢迎来到本系列的第 5 部分!如果你已经学到这儿了,那么我希望你享受学习 Go 的乐趣并运用 Go 和...

  • 使用 Go 和 ReactJS 构建聊天系统(四):处理多客户端

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-4) > 本文是关于使用 ReactJS 和 Go 构建聊天应用程序的系列文章的第 4 部分。你可以在这里找到第 3 部分 - [前端实现](https://studygolang.com/articles/22429) 这节主要实现处理多个客户端消息的功能,并将收到的消息广播到每个连接的客户端。在本系列的这一部分结束时,我们将:...

  • 使用 Go 和 ReactJS 构建聊天系统(三):前端实现

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-3) > 本文是关于使用 ReactJS 和 Go 构建聊天应用程序的系列文章的第 3 部分。你可以在这里找到第 2 部分 - [后端实现](https://studygolang.com/articles/22426) ## Header 组件 我们先来创建一个非常简单的 Header 组件。我们需要在 `frontend...

  • 使用 Go 和 ReactJS 构建聊天系统(二):gorilla/websocket 包提供的 WebSockets

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-1-and-2) > 本文是使用 ReactJS 和 Go 来构建聊天应用程序的系列文章的第 2 部分。你可以在这里找到第 1 部分 - [初始化设置](https://studygolang.com/articles/22423) 现在我们已经建立好了基本的前端和后端,现在需要来完善一些功能了。 在本节中,我们将实现一个基...

  • 使用 Go 和 ReactJS 构建聊天系统(一):初始化项目

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/part-1-and-2) 我们将通过设置两个项目来开始这个课程。一旦我们完成了枯燥的设置,就可以开始添加新功能并构建我们的应用程序,将看到一些积极的结果! ## 目标 在这部分课程结束后,你将掌握: - 在 `backend/` 目录创建基本的 Go 应用 - 在 `frontend/` 目录创建基本的 ReactJS 应用...

  • 使用 Go 和 ReactJS 构建聊天系统(前言)

    本节完整代码:[GitHub](https://github.com/watermelo/realtime-chat-go-react/tree/master) ## 课程目标 在这个项目中,我们将考虑使用 Go 作为后端,React.JS 作为前端来构建一个聊天系统。 本课程将有助于你巩固 Go 的并发概念和技术,提供开发更复杂的 Go 应用程序的实际经验,希望你能够轻松编写常用的 Go 程序。 ## 目的 我们将逐步构建这个聊天系统,以确保整个课程的学习保持轻松...

  • 120
    我是如何在大型代码库上使用 pprof 探索 Go 中的内存泄漏

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/how-i-investigated-memory-leaks-in-go-using-pprof-on-a-large-codebase/pprof_6.png) 在今年的大部分时间里,我一直在 Orbs 团队用 Go 语言做可扩展的区块链的基础设施开发,这是令人兴奋的一年。在 2018 年的时候,我们研究我们的区块链该选择哪种语言实现。因为我们知道 ...

  • 120
    使用 Go 实现简单的事件总线

    ![pic_1](https://raw.githubusercontent.com/studygolang/gctt-images/master/let%E2%80%99s-write-a-simple-event-bus-in-go/pic_1.png) 事件驱动架构是计算机科学中一种高度可扩展的范例。它允许我们可以多方系统异步处理事件。 事件总线是[发布/订阅模式](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_...

  • 120
    Go: 什么是 unsafe 包

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/what-is-the-unsafe-package/unsafe_1.png) ℹ️本文基于 Go 1.12。 看到 unsafe 这个名称,我们应该尽量避免使用它。想要知道使用 unsafe 包可能产生不安全的原因,我们首先来看看官方文档的描述: > unsafe 包含有违背 Go 类型安全的操作。 > > 导入 unsafe 包可能...

  • 120
    Go: 理解 Sync.Pool 的设计

    ![sync pool](https://raw.githubusercontent.com/studygolang/gctt-images/master/understand-the-design-of-sync-pool/3.jpg) ℹ️本文基于 Go 1.12 和 1.13 版本,并解释了这两个版本之间 sync/pool.go 的演变。 `sync` 包提供了一个强大且可复用的实例池,以减少 GC 压力。在使用该包之前,我们需要在使用池之前和之后对应用程序进行基准测试。这非...

  • Go 中的请求处理概述

    使用 Go 处理 HTTP 请求主要涉及两件事:ServeMuxes 和 Handlers。 [ServeMux](https://docs.studygolang.com/pkg/net/http/#ServeMux) 本质上是一个 HTTP 请求路由器(或多路复用器)。它将传入的请求与预定义的 URL 路径列表进行比较,并在找到匹配时调用路径的关联 handler。 handler 负责写入响应头和响应体。几乎任何对象都可以是 handler,只要它满足[http.Handler...