• unsafe 真就 unsafe 吗 - part1

    ## unsafe 包详解 在乌克兰的利沃夫举行的 [Lviv Golang community event](https://www.facebook.com/events/470065893928934/482981832637340/?notif_t=admin_plan_mall_activity&notif_id=1580732874088578) 中,我发表了一个关于 `unsafe` 包的演讲,这个演讲中我尝试回答了标题中提到的问题:`unsafe` 包究竟有多 unsafe...

  • Go 1.13 中值得期待的特性

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

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

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

  • Go Modules 的使用方法 —— Go 官方博文

    ## 简介 Go 1.11 和 1.12 引入了[对 modules(模块)的初步支持](https://golang.org/doc/go1.11#modules),这是一个能让依赖项的版本信息更加明确和易于管理的依赖管理系统。本文旨在为你使用模块提供基本的操作指导。后续会有一篇文章来说明如何发布一个模块以供别人使用。 一个模块是一系列 [Go 代码包](https://golang.org/ref/spec#Packages) 的集合,它们保存在同一个文件树中。文件树的根目录中包...

  • Go 语言测试进阶教程

    你好啊各位码农们!在这个教程中,我们将介绍一些进阶的测试实践,很多 Go 语言的核心开发人员以及流行的生产级工具都使用到了它们。 我希望这种通过生产上真实使用的案例来讲解的方法。能够给你一些启示,让你深入了解怎么去测试你自己的生产级别的 Go 程序。 > 注意:如果你对如何测试 Go 语言的程序完全不了解的话,我建议你先看看之前的教程: > [an introduction to testing in Go](https://tutorialedge.net/golang/intr...

  • Go 语言的 Stack Trace

    ## 简介 拥有必要的 Go 语言调试技巧能让我们在定位问题的时候节省大量的时间。我认为尽可能地记录下详尽的日志信息是一个很好的实践,但是有时候单单记录下错误是不足够的。正确的理解 stack trace(堆栈轨迹)的信息能让你准确地定位到 bug 的所在,避免出现日志记录不够,需要添加更多跟踪日志,然后等待 bug 重现的窘境。 我在开始编写 Go 程序的时候就已经开始了解 stack trace 方面的知识。我们有时会写错代码,使得 Go 运行时 panic 掉我们的程序并抛出一...

  • 浅析 Go 语言的数字常量

    ## 概述 Go 语言的常量的实现方法是 Go 的一个亮点。在 Go 的语言规范中的定义[常量规则](http://golang.org/ref/spec#Constants) 是 Go 独有的。 它们在编译器级别提供 Go 所需要的灵活性,使我们编写的代码可读且直观,同时仍保持类型安全。 本文将会探讨”什么是数字常量“、”它们在最简单的情况下时有怎样的行为“以及”怎样去探讨它们才是最好的“这几个方面,其中会有很多吓人的细节问题、名词和概念,所以本文将会放慢速度慢慢的剖析之。 ...

  • Go 语言中的同步队列

    ## 问题 假设我们在运营一家 IT 公司,公司里面有程序员和测试员。为了给个机会他们互相认识对方,并且让他们能够在工作中放松一点,我们买了一个乒乓球台,并且制定了如下规则: - 每次只能两个人(不能少于或多于两人)玩。 - 只有上一对玩家结束了,下一对玩家才能玩,也就是说,不能只换下一个人。 - 只能是测试员和程序员组成一对来玩,(不能出现两个测试员或者两个程序员一起玩的情况)。如果员工想要玩的话,那么他得等到有合适的对手了才能开始游戏。 ```go func main...

  • 深入理解 sync.RWMutex:解决读者-写者问题

    在某个数据需要被多个线程共享访问的时候,会出现读者-写者问题(这里的「问题」是复数形式的,因为读者-写者问题有多个变种)。访问共享数据的线程有两种类型:读者和写者。读者只会读取数据,而写者则是修改它。当写者拥有了访问数据的权限后,其它的线程(不管是读者还是写者)都不能访问这个数据。这种约束的需求在现实中是存在的,比如:当写者不能原子性地修改某个数据(例如数据库)时,在修改完成之前,要读取这个数据的读者要被阻塞,以免读者获取到损坏的数据(脏数据)。对于读者-写者问题的核心,还有很多修订的限制,比如...

  • Go 语言中的 Timer Routines 与优雅退出

    在我的 Outcast(译注:作者自己做的一款天气预告 App) 数据服务器中,有几个数据检索任务要用到不同的 Go routine 来运行, 每个 routine 在设定的时间间隔内唤醒。 其中最复杂的工作是下载雷达图像。 它复杂的原因在于:美国有 155 个雷达站,它们每 120 秒拍摄一张新照片, 我们要把所有的雷达图像拼接在一起形成一张大的拼接图。(译注:有点像我们用手机拍摄全景图片时,把多张边缘有重叠的图片拼接成一张大图片) 当 go routine 被唤醒去下载新图像时,它必须尽快为...

  • Go 语言的 Modules 系统介绍

    即将发布的 Go 语言 1.11 版本将会给我们带来对 *modules*(模块)的实验性支持,这是 Go 语言新的一套依赖管理系统。 (译注:很多编程语言中,把 modules 译作「模块」,但由于目前该机制在 Go 语言还没正式发布,因此尚未有非常普及的译法。而类似的 vendor 一词的翻译,大多中文文章都是采取保留英文原文的方式处理,因此本文对 modules 的翻译参考 vendor 的处理:保留英文原文) 前些日子,[我简单地写了一编关于它的文章](https://rob...