GCTT - Go 中文翻译组

收录了 543 篇文章 · 390 人关注

  • goroutine 可能使程序变慢

    ## 如何使用 goroutine 才能使你的 CPU 满负载运行呢 下面,我们将会展示一个关于 for 循环的代码,将输入分成几个序列添加到 Goroutines 里面!我敢打赌你之前可能有过几次这种情况,但是每次引入 gorountine 都让你的代码变得更快吗? 下面是一个简单的循环示例,它似乎很容易变成并发代码,但正如我们将看到的,并发版本不仅不会更快,实际上需要花费两倍的时间。 ## 串行循环,我们以一个把索引相加的简单的串行循环作为示例 ```go // S...

  • 120
    Go:我应该用指针替代结构体的副本吗?

    ![logo](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-should-i-use-a-pointer-instead-of-a-copy-of-my-struct-44b43b104963/1_IO4bo74w6aX7rKC_spjmvw.png) 对于许多 `golang` 开发者来说,考虑到性能,最佳实践是系统地使用指针而非结构体副本。 我们将回顾两个用例,来理解使用指针而非结构体副本...

  • 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_...

  • Go 语言中的集成测试:第一部分 - 用 Docker 执行测试

    ## 简介 > “测试会带来失败,而失败会带来理解。” —— Burt Rutan Burt Rutan 是一名航空航天工程师,他设计了 Voyager,这是第一架在不停车或加油的情况下环球飞行的飞机。虽然 Rutan 不是软件工程师,但他的话充分说明了测试的重要性,甚至是软件测试。所有形式的软件测试都非常重要,无论是单元、集成、系统还是验收测试。但是,根据项目的不同,一种形式的测试可能比其他形式更有价值。换句话说,有时一种形式的测试可以比其他形式更好地反映软件的健康和完整性。 ...

  • Go 高级并发模式:第二部分(计时器)

    正如我在[上一篇文章](https://studygolang.com/articles/19394) 中所述,准确使用计时器很难的,所以这里进行一些说明。 ## 前言 如果你认为结合 Goroutines 去处理时间和计数器很简单的话,那你就错了,这里有提到的一些与 time.Timer 相关的问题或 bug: * [time: Timer.Reset is not possible to use correctly #14038](https://github.com/go...

  • 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 包可能...

  • Go 垃圾回收:第二部分 - GC 追踪

    ## 前言 这是三篇系列文章中的第二篇,该系列文章将会提供一个对 Go 垃圾回收器背后的机制和概念的理解。本篇主要介绍如何生成 GC 追踪并解释它们。 三篇系列文章的索引: 1)[Go 垃圾回收:第一部分 - 概念](https://studygolang.com/articles/21569) 2)[Go 垃圾回收:第二部分 - GC 追踪](https://studygolang.com/articles/21570) 3)即将发布 ## 介绍 在第...

  • Go 中的垃圾回收:第一部分 - 基础

    这是三篇系列文章的第一篇博文,系列文章提供了 Go 中垃圾回收背后的机制和概念的理解。这篇博文主要介绍回收器的基础概念。 三篇系列文章的索引: 1) [Go 中的垃圾回收:第一部分 - 概念](https://studygolang.com/articles/21569) 2) [Go 中的垃圾回收:第二部分 -GC 追踪](https://studygolang.com/articles/21570) 3) 即将诞生 ## 简介 垃圾回收器负责跟踪堆内存分配,释放无...

  • 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...

  • 用 Go 语言构建 SQL 解析器

    ## 摘要 本文旨在对如何用 Go 语言构建 [LL(1) 文法的解析器](https://en.wikipedia.org/wiki/LL_parser) ——此例用来解析 SQL 请求——作出简要的介绍。只需要读者具有极少的编程能力(函数、结构体、条件语句和 for 循环)。 如果你想直接跳过文章直接看结果,这里是完成后的解析器代码仓库: <https://github.com/marianogappa/sqlparser> ## 为了简化而放弃的内容 我们不会...

  • Let US sort

    ## 在这篇文章里,我尝试发掘 [Go](https://golang.org/) 语言的所有特性,以便用最优的、利用多核处理器的方式来实现 [归并排序](https://en.wikipedia.org/wiki/Merge_sort)。 时间复杂度为 `O(nlogn)` 的最优排序算法中,归并排序是其中之一。它的原理为将数组分为两部分,分别进行排序,最后再归并,这种做法的开销没那么大。 ![红色表示分割和排序,绿色表示归并](https://raw.githubusercont...

  • Golang Module Vs Dep: 支持 & 反对

    ![img](https://raw.githubusercontent.com/studygolang/gctt-images/master/vgo-module/vgo-modules-dependency-management-golang-blog-hero-1200x630.png) Go 语言有着一个热情的社区。尤其是当涉及推动语言本身及其生态的进步时,这种热情催生出精彩的讨论和许多很棒的想法,但是在前进的方向上发生分歧时,热情也会使社区分裂。比如,关于版本和依赖管理,在今年早...

  • 并发陷阱 2: 未完成的工作

    Jacob Walker 2019 年 4 月 18 日 ## 介绍 在我的第一篇文章 [Goroutine 泄露](https://studygolang.com/articles/17364) 中,我提到并发编程是一个很有用的工具,但是使用它也会带来某些非并发编程中不存在的陷阱。为了继续这个主题,我将介绍一个新的陷阱,这个陷阱叫做未完成的工作。当进程在非主协程的协程结束前终止时,这种陷阱就会发生。根据 Gorotine 的特性,强制关闭它将造成一个严重的问题。 ## 未完成...

  • 你为什么要喜欢 sync.Pool ?

    ## 介绍 因为它很快。通过文章底部存储库中的基准测试可以减少**4982 倍**的内存占用。 ![Comparing pool performance. Less than better.](https://raw.githubusercontent.com/studygolang/gctt-images/master/Why-you-should-like-sync.Pool/1.png) 相比之下, Pool 的性能更快更好。 ## Ok, 这究竟是怎么回事呢? ...

  • 如何使用 Go kit 工具包编写微服务

    我在互联网上搜索了很久关于使用 Go kit 工具包编写微服务的精品教程(我认为我的 Google-fu 相当不错),但是 我没有找到 ...... 来自[Go kit 代码库的示例](https://github.com/go-kit/kit/examples) 很好,但恕我直言,文档很枯燥。 然后我决定购买这本名为 `Go Programming Blueprints, 2nd Edition` 的书,这本书相当不错,但只有两章专门讨论 Go kit(一个用于实际开发微服务...

  • Docker 容器编排实践练习

    在本次练习中,你将体验到 Docker 的容器编排功能。首先你需要在单个主机上部署一个简单的应用程序,并了解其工作机制。然后,通过配置 Docker Swarm 模式,你将学习到怎样在多个主机上部署相同的简单应用程序。最后,你将看到如何对应用的规模进行扩容、缩容,以及如何将工作负载在不同的主机之间转移。 (译者注:登录原网站可使用在线练习资源) > **难度**:入门级 > **时间**:约 30 分钟 **任务**: - [第一节 - 容器编排是什么](# 第一节:容器编排是什么 ) ...

  • 现代服务端技术栈介绍 —— Golang、Protobuf 和 gRPC

    ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/modern-server/1_W_1gSpbn79xtYZw9_TBGPA.jpg) 身边多了一些新的服务端程序员,这一次,一切都与谷歌有关。自从谷歌开始在他们的生产系统中使用 Go 语言以来,`go` 语言的流行度快速地提升。从微服务架构创立至今,人们一直在关注像 `gRPC`、`Protobuf` 这样的现代数据通信解决方案。在这篇文章中,我将分别...

  • 如何使用 Golang 处理 MySQL 的 binlog

    大家好,我是 Artem,一名 Golang 开发。我们的团队花费了大量时间训练 MySQL binlog。这里整合一些简单用法,不会放过任何隐藏的陷阱。示例代码将在最后显示。 每次从数据库查询的返回结果中拉取用户信息时,主项目中会有高负载模块。此时使用缓存是一个不错的建议,但是什么时候重置缓存呢?这需要由数据来决定更新时间。 MySQL 的主从复制是一个很棒的设计。而我们的守护进程可以视为一个通过 binlog 获取数据的 slave,binlog 设置成 row 格式。这样就能使...

  • 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, 请跳到下一节。 ...