RESTful API 设计最佳实践
原文:RESTful API Design. Best Practices in a Nutshell.作者:Philipp Hauer 项目资源的URL应该如何设计?用名词复数还是用名词单数?一个资源需要多少个URL?用哪种HTTP方法来创建一个新的资源?可选参数应该放在哪里?那些不涉及资源操作的URL呢?实现分页和版本控制的最好方法是什么?因为有太多的疑问,设计RESTful API变得很棘手。在这篇文章中,我们来看一下RESTful API设计,并给出一个最佳实践方案。 每个资源使用两个U...阅读全文
你也能写个 Shadowsocks
本文将教你从0写一个Shadowsocks,无需任何基础,读完本文你就能完成一个轻量级、高性能的 Shadowsocks 代替品。 我们暂且把最终完成的项目叫做 Lightsocks,如果你很急切地想看到结果,可以先体验本文最终完成的项目 Lightsocks ,也可以下载阅读源码。 认识 Shadowsocks Shadowsocks 是一个能骗过防火墙的网络代理工具。它把要传输的原数据经过加密后再传输,网络中的防火墙由于得不出要传输的原内容是什么而只好放行,于是就完成了防火墙穿透,也即是所谓...阅读全文
用dep代替 go get 来获取私有库
用 dep 代替 go get 来获取私有库 (金庆的专栏 2017.11) go get 功能比较弱,无法获取分支,标签,特定版本,fork, 而 dep 可以做到。dep 还可以获取私有库。 用 gitee.com 私有库作测试。创建 gogettest 库。 可用: go get -u gitee.com/jinq0123/gogettest 如果改为私有库则失败: λ go get -v gitee.com/jinq0123/gogettest Fetching https://gite...阅读全文
Golang 中的微服务 - 第一部分
## 介绍 Golang 中的微服务系列总计十部分,预计每周更新。本系列的解决方案采用了 protobuf 和 gRPC 作为底层传输协议。为什么采用这两个技术呢?我花了相当长的时间,才想出并决定采用这个方案。这个方案对开发者来说,非常清晰而简明。我也很乐意把自己在搭建、测试和部署端到端的微服务过程中的心得,分享给想接触这块的朋友们。 在这个教程中,我们将先接触几个基础的概念和术语,然后开始搭建第一个简单的微服务模型。 本系列中,我们将会创建以下服务: - 委托 - 存...阅读全文
90后“老头儿”和00后Go小子的硬盘夜话
来自:码农翻身(微信号:coderising)作者:刘欣1初次见面虽然这个目录中各种编程语言写的程序层出不穷,但Java还是怀念不幸罹难的C老头儿。他经常给同一目录中的Python ,Ruby说C老头儿知识多么渊博,贴近硬件运行,速度飞快,能从他身上学到很多东西等等。(注:参加《C老头儿和Java小子的硬盘夜话》)今天目录里入驻了一个新家伙,Java一看文件名"hello.go"就知道这是一门新的语言,难道这们语言叫做Go吗? 用一个动词作为语言名称,挺少见的啊!Java赶紧上网搜索,我赛,这个...阅读全文
Go语言中的TCP/IP网络编程
Go语言TCP/IP网络编程 乍一看,通过TCP/IP层连接两个进程会感觉可怕, 但是在Go语言中可能比你想象的要简单的多。 TCP/IP层发送数据的应用场景 当然很多情况下,不是大多数情况下,使用更高级别的网络协议毫无疑问会更好,因为可以使用华丽的API, 它们隐藏了很多技术细节。现在根据不同的需求,有很多选择,比如消息队列协议, gRPC, protobuf, FlatBuffers, RESTful网站API, websocket等等。 然而在一些特殊的场景下,特别是小型项目,选择任何其他...阅读全文
Go语言开发区块链只需180行代码
区块链开发用什么语言?通过本文你将使用**Go**语言开发自己的区块链(或者说用go语言搭建区块链)、理解哈希函数是如何保持区块链的完整性、掌握如何用Go语言编程创造并添加新的块、实现多个节点通过竞争生成块、通过浏览器来查看整个链、了解所有其他关于区块链的基础知识。 但是,文章中将不会涉及工作量证明算法(PoW)以及权益证明算法(PoS)这类的共识算法,同时为了让你更清楚得查看区块链以及块的添加,我们将网络交互的过程简化了,关于 P2P 网络比如“全网广播”这个过程等内容将在后续文章中补上...阅读全文
如何写 go 中间件
编写 go 中间件看起来挺简单的,但是有些情况下我们可能会遇到一些麻烦。 让我们来看一些例子。 ## 读取请求 我们例子中的所有中间件都会接收一个 `http.Handler` 作为参数,并返回一个 `http.Handler` 。 这样便于将中间件链接起来。我们所有的中间件将会遵循如下基本模式: ```go func X(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.Resp...阅读全文
基于 rabbitmq 实现的延时队列
虽然 rabbitmq 没有延时队列的功能,但是稍微变动一下也是可以实现的 实现延时队列的基本要素 存在一个倒计时机制:Time To Live(TTL) 当到达时间点的时候会触发一个发送消息的事件:Dead Letter Exchanges(DLX) $~~~~~~$基于第一点,我利用的是消息存在过期时间这一特性, 消息一旦过期就会变成dead letter,可以让单独的消息过期,也可以设置整个队列消息的过期时间而rabbitmq会有限取两个值的最小值 $~~~~~~$基于第二点,是用到了ra...阅读全文
Golang原生爬虫 简单爬虫实现 不依赖第三方包库 方便理解技术原理 (一)
探索技术的路上本应该自己造轮子,即使市面上有再多的选择,自己动手尝试也是必要的,第一次尝试必然会问题众多,但你不觉得解决他是一件很有成就感的事情吗,这样才能带给你更大的进步和更深刻的领悟。如果没有写过的并感兴趣的不妨一起来实现一下这个简单的爬虫。其实用golang实现爬虫是很简单是事情,但也分情况,我们这次的文章就分享一种最简单的爬虫实现方式,用到的官方库如下:import ( "fmt" "io" "io/ioutil" "net/htt...阅读全文
Go语言RESTful JSON API创建
Go语言开发RESTFul JSON API RESTful API在Web项目开发中广泛使用,本文针对Go语言如何一步步实现RESTful JSON API进行讲解, 另外也会涉及到RESTful设计方面的话题。 也许我们之前有使用过各种各样的API, 当我们遇到设计很糟糕的API的时候,简直感觉崩溃至极。希望通过本文之后,能对设计良好的RESTful API有一个初步认识。 JSON API是什么? JSON之前,很多网站都通过XML进行数据交换。如果在使用过XML之后,再接触JSON, 毫...阅读全文
Golang用body来get或post数据
用body来处理参数,能处理多层结构化参数,url不能传送多层结构数据 // 基础方法,这里多用于访问webapi,配合上json转换。此方法可以运行但是不算完善。 func httpDo(method string, url string, msg string) { fmt.Println("----", url, "----") client := &http.Client{} body := bytes.NewBuffer([]byte(msg)) req, err := http.Ne...阅读全文
Go语言基础-sync包
Golang 推荐通过 channel 进行通信和同步,但在实际开发中 sync 包用得也非常的多,在以太坊的源码中也有很多这类应用的体现。 Go sync包提供了:sync.Mutex,sync.RMutex,sync.Once,sync.Cond,sync.Waitgroup,sync.atomic等,文本主要对sync.Mutex,sync.RMutex和sync.Waitgroup的使用进行了说明,后续会推出其它方法的使用说明。 sync包含一个 Locker interface: ty...阅读全文
理解 golang 中的 context(上下文) 包
![](https://raw.githubusercontent.com/studygolang/gctt-images/master/understanding-the-context-package-in-golang/0_exTPQ4ppfrdjuXcR.jpg) Go 中的 context 包在与 API 和慢处理交互时可以派上用场,特别是在生产级的 Web 服务中。在这些场景中,您可能想要通知所有的 goroutine 停止运行并返回。这是一个基本教程,介绍如何在项目中使用它以...阅读全文
图解 Go 并发编程
你很可能从某种途径听说过 Go 语言。它越来越受欢迎,并且有充分的理由可以证明。 Go 快速、简单,有强大的社区支持。学习这门语言最令人兴奋的一点是它的并发模型。 Go 的并发原语使创建多线程并发程序变得简单而有趣。我将通过插图介绍 Go 的并发原语,希望能点透相关概念以方便后续学习。本文是写给 Go 语言编程新手以及准备开始学习 Go 并发原语 (goroutines 和 channels) 的同学。 ## 单线程程序 vs. 多线程程序 你可能已经写过一些单线程程序。一个常用的编...阅读全文
Go 中的匿名函数和反射
我最近在浏览 Hacker News 时看到一篇吸引我眼球的文章《[Python中的Lambdas和函数](http://www.thepythoncorner.com/2018/05/lambdas-and-functions-in-python.html?m=1)》,这篇文章 —— 我推荐你自己阅读一下 —— 详细讲解了如何运用 Python 的 lambda 函数,并举了一个例子展示如何使用 Lambda 函数实现干净,[DRY](https://en.wikipedia.org/wiki...阅读全文
GO GC 垃圾回收机制
9.6 GO GC 垃圾回收机制 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的内存管理功能。 在传统的系统级编程语言(主要指C/C++)中,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值。由于内存是有限的,所以当程序不再需要使用某个变量的时候,就需要销毁该对象并释放其所占用的内存资源,好重新利用这段空间。在C/C++中,释放无用变量内存空间的事情需要由程序员自己来处理。就是说当程序员认为变量没用了,就手动地释放其占用的内存。但是这样显然非常繁琐,如果...阅读全文