• 如何发送和接收 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 语言中的错误处理 - 第二部分

    ## 简介 在 [第一部分](https://studygolang.com/articles/17169) 中,我们学习了 error 接口以及标准库是如何通过 errors 包来创建 error 接口值的。我们也学习了如何使用 error 接口值,通过这些值来判断是否发生了错误。最后,我们学习了一些标准库是如何通过导出 error 接口变量来帮助我们确定发生错误的具体类型。 在 Go 语言中什么时候应该使用自定义错误类型是比较难把握的。大部分情况下,error 包提供的 erro...

  • Go 语言中的错误处理 - 第一部分

    ## 简介 在 Go 语言中,如果一个函数或者方法需要返回任何错误,通常会使用 error 接口类型作为返回类型。在标准库中,所有返回了错误信息的函数和方法使用的都是这个接口。例如,下面是 http 包中 Get 方法的声明: 清单 1.1 http://golang.org/pkg/net/http/#Client.Get ```go func (c *Client) Get(url string) (resp *Response, err error) ``` ...

  • webhook 是什么以及如何创建

    我们在网上做的工作,大部分其实就是事件,webhooks 已经成为了连接系统的主要方式,不管是用户创建、支付成功、DockerHub 镜像推送或者 Git 仓库上的合并请求,这些都是非常有用并且轻量级的共享信息的方式 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/webhook/1.png) 那么,webhook 究竟是什么呢?webhook 是应用给其它应用提供实时信息的一种方式。信息一产生...

  • 我们必须遵循的 12 个 Go 语言最佳实践

    本文旨在提供一个切实的指导,在 Go 语言中实现最佳实践和设计模式。这些编程技巧可以帮助开发者编写出较好的代码。你一定已经读过了 [Go Tutorial](https://tour.golang.org/welcome/1) 和 [Effective Go](https://golang.org/doc/effective_go.html)。 为了让大家对这些编程技巧有更加深刻的认识,我在讨论这些最佳实践的时候会附加一些示例代码。 那些编写了许多优秀代码的大师们,一直在使用一些 G...

  • 使用 JWT 保护 API 访问

    APIs 的一个常见用例是提供一个授权中间件,允许客户端向 APIs 发送授权请求。通常来说,客户端会执行一些授权逻辑,产生一个「会话标识」。最近比较流行的 JWT ( JSON Web Tokens ) 提供了一个带超时时间的「会话标识」,使用它不需要额外的空间来执行验证逻辑。 本文是接着上一篇文章写的,在阅读下面内容之前建议先看一下之前的那篇文章 [用 go-chi 处理 HTTP 请求](https://scene-si.org/2018/03/12/handling-http-re...

  • Golang 下的微服务 - 第 10 部分 - 总结

    一路走来,多么奇妙的一段旅程啊!完成这些文章花了好几个月的时间。第一篇文章发布于 2017 年底,现在 2018 年已经过去快一半了,我才刚刚在写本系列最后一篇文章。 写这一系列文章花费了我不少时间和精力。对我来说这是一个令人生畏的任务,首先是因为我对各部分知识只是有个大概的了解,其实,写这些文章的部分初衷也是想提高我对相关知识的理解,同时也想得到社区的反馈,没有比得到社区的认可更棒的事情了。在写作过程中,我学到了很多,和很多又酷又聪明的人进行了讨论,他们给了我很大帮助。其次,这一系列文章...

  • 实现一个 Golang 调试器(第三部分)

    到目前为止我们已经知道如何单步执行用 ptrace 暂停的进程(tracee)以及如何从二进制文件中获取一些调试信息(在[这里](https://studygolang.com/articles/12794)阅读相关内容)。接下来就是设置断点,等待程序运行到断点处,查看进程相关信息的时候了。 让我们从上一篇文章中用到的汇编代码开始 ```asm section .data msg db "hello, world!", 0xA len equ $ - ms...

  • 实现一个 Golang 调试器(第二部分)

    在[第一部分](https://studygolang.com/articles/12553)里,我们首先介绍了开发环境并且实现了一个简单的调试器(tracer),它可以使子进程(tracee)在最开始处停止运行,然后继续执行,并显示它的标准输出。现在是扩展这个程序的时候了。 通常,调试器允许单步执行被调试的代码,这个可以通过 [ptrace](http://man7.org/linux/man-pages/man2/ptrace.2.html) 的 PTRACE_SINGLESTEP 命...

  • 探索 vgo

    昨天,Russ Cox 发布了 [vgo](https://research.swtch.com/vgo),作为一个现有 go 构建命令的继任者,添加了一直缺失的包版本管理功能。虽然它只是一个大胆的尝试,但是在大家都认为 [dep](https://github.com/golang/dep) 将要成为 Go 语言官方正式的包管理工具的时候,它的出现多少让大家有点意外。Russ 写的 [vgo 简介](https://research.swtch.com/vgo-intro) 和一起发布的 [v...

  • 120
    Go 语言机制之栈和指针

    ## 前言 本系列文章总共包括 4 篇,主要帮助大家理解 Go 语言中一些语言机制和其背后的设计原则,包括指针、栈、堆、逃逸分析和值传递/地址传递。这一篇是本系列的第一篇,主要介绍栈和指针。 以下是本系列文章的索引: 1. [Go 语言机制之栈与指针](https://studygolang.com/articles/12443) 2. [Go 语言机制之逃逸分析](https://studygolang.com/articles/12444) 3. [Go 语言机制之内存剖析...