可复制, 可验证, 已验证的构建(vgo)

本文译自 Reproducible, Verifiable, Verified Builds, Go & Versioning 的第 5 部分, 版权@归原文所有. 一旦 Go 开发人员和工具都共享了包版本控制的词汇表, 那么在工具链中添加可复制, 可验证以及已验证的构建就相对简单了。事实上, 这基本上已经在 vgo 原型中了. 由于人们有时对这些术语的确切定义不一致,让我们来建立一些基本的术语. 这篇文章: 一个可复制的构建, 当重复构建时, 会产生相同的结果. 一个可验证的构建, 记录足够的...阅读全文

lingchao.xin 2018-02-24 19:00 lingchao

Go编程技巧--io.Reader/Writer

Go原生的pkg中有一些核心的interface,其中io.Reader/Writer是比较常用的接口。很多原生的结构都围绕这个系列的接口展开,在实际的开发过程中,你会发现通过这个接口可以在多种不同的io类型之间进行过渡和转化。本文结合实际场景来总结一番。 总览 围绕io.Reader/Writer,有几个常用的实现: net.Conn, os.Stdin, os.File: 网络、标准输入输出、文件的流读取 strings.Reader: 把字符串抽象成Reader bytes.Reader:...阅读全文

Segmentfault 2018-02-24 16:34:37 P_Chou水冗

golang/python 下载大文件时怎样避免oom

问题场景:高频系统中,agent 会向ATS 服务器发出刷新和预缓存的请求,这里的请求head 里面有GET ,PURGE等,因为一般的预缓存都是小文件,但是某天,突然服务器oom。。。罪魁祸首发现是并发GET 大文件将服务器打死了。第一个版本是python 的,第二个版本是golang 实现的, 这里记录下两种语言的 下载大文件的实现方式。 第一种是python,使用的是request 库, 使用流式读取的方式,写到空设备中去。 res = self.session.request(metho...阅读全文

开源中国博客 2018-02-24 10:33:08 caucy

最小版本选择(vgo)

本文译自 Minimal Version Selection, Go & Versioning 的第 4 部分, 版权@归原文所有. 版本化的 Go 命令必须决定在每个版本中使用哪个模块版本. 我把指定构建中用到的模块和版本列表称之为构建列表. 为了稳定开发, 今天的构建列表也必须是明天的构建列表. 但是, 开发人员也必须允许更改构建列表: 升级所有模块, 升级一个模块或降级一个模块. 因此版本选择问题是定义其意义并给出算法实现, 构建列表中的 4 个操作为: 构造当前的构建列表. 将所有模块升...阅读全文

lingchao.xin 2018-02-23 19:24 lingchao

Go 反射:根据类型创建对象-第一部分(原始类型)

> 这是关于在 Go 中根据类型创建对象的博客系列两部分的第一部分。这部分讨论原始类型的对象创建 ![](https://raw.githubusercontent.com/studygolang/gctt-images/master/go-reflect/cover1.png) Go 中的 reflect 包提供了根据执行过程中对象的类型来改变程序控制流的 API。 reflect 包提供了两个重要的结构 - Type 和 Value。 Type 是一个 G...阅读全文

Go语言中文网 2018-02-23 17:51:11 polaris

Grpc+Grpc Gateway实践一 介绍与环境安装

介绍与环境安装 假定我们有一个项目需求,希望用Rpc作为内部API的通讯,同时也想对外提供Restful Api,写两套又太繁琐不符合 于是我们想到了Grpc以及Grpc Gateway,这就是我们所需要的 准备环节 在正式开始我们的Grpc+Grpc Gateway实践前,我们需要先配置好我们的开发环境 Grpc Protoc Plugin Protocol Buffers Grpc-gateway Grpc 是什么 Google对Grpc的定义: A high performance, op...阅读全文

Segmentfault 2018-02-23 17:34:38 EDDYCJY

为 Go Web-apps 编写 Dockerfiles 的终极指南

你或许想在 Docker 中使用 Go,原因有: 1. 如果你想在 Kubernetes 上运行,打包为镜像是必须的(就像我一样) 2. 你不得不在同一台机器上运行不同的 Go 版本 3. 开发和生产都需要精确的、可复制的、可共享的和确定的环境 4. 你需要快速和简单的方式来构建和部署编译好的二进制文件 5. 你想快速开始(任何安装了 Docker 的人都可以直接开始编写代码而不需要设置其他依赖或 `GOPATH` 环境变量) 恭喜你,你来对地方了。 我们将逐步构建一个...阅读全文

Go语言中文网 2018-02-23 17:21:55 polaris

Go 语言的错误处理

Go 语言的错误处理是基于明确的目的而设计的。你应该从函数中返回所有可能的错误,并且检查/处理这些返回值。和其他语言相比,这一点可能看起来有些繁琐和不人性化,其实并不是这样的。让我们来看看一些基本的例子,然后继续做一些较重要的事情。 ## Non 错误 实际上 Go 有个概念 non-error。这是一个语言特性,不能用在用户自定义函数中。最明显的例子就是从 map 中通过 key 获取值。 ```go if val, ok := data["key"]; ok { //...阅读全文

Go语言中文网 2018-02-23 17:10:38 polaris

尝鲜vgo

> 查看原文:[blog.keyboardman.me](http://blog.keyboardman.me/2018/02/23/early-adopters-versioned-go/) 一直以来,对go来说依赖包的版本控制上没有一个好的方案,当前主要有两种方式`Import Versioning`和`Semantic Versioning`。 * Import Versioning:`gopkg.in`网站,其实是GitHub版本变化的重定向器,你可以通过`gopkg.in/ya...阅读全文

Go语言中文网 2018-02-23 16:22:39 0x5010

也许 Go 开发可以更简单!Go += Package Versioning

简评:对于Go来说一直以来依赖包的版本控制上没有一个好的方案,尽管社区诞生了不下十余个解决该问题的工具,但一直以来没有一个官方的支持。这个提案有望在Go的下个版本中看到官方的包版本控制了,去除了GOPATH依赖,同时还引入了module 的概念,真正意义上实现了重编译,可谓一次大的变更编译:缪斯的情人 是时候为 Go 添加包版本控制了! 更确切地说,我们需要把包版本的概念普及到Go 开发者和工具常用词汇中,以便在后续的相互沟通时能准确一致的表达哪些程序代码需要编译、运行和解析。同样,go 命令也...阅读全文

Segmentfault 2018-02-23 11:34:39 缪斯的情人

也许 Go 开发可以更简单!Go += Package Versioning

> > 简评:对于Go来说一直以来依赖包的版本控制上没有一个好的方案,尽管社区诞生了不下十余个解决该问题的工具,但一直以来没有一个官方的支持。这个提案有望在Go > 的下个版本中看到官方的包版本控制了,去除了GOPATH依赖,同时还引入了module 的概念,真正意义上实现了重编译,可谓一次大的变更 是时候为 Go 添加包版本控制了! 更确切地说,我们需要把包版本的概念普及到Go 开发者和工具常用词汇中,以便在后续的相互沟通时能准确一致的表达哪些程序代码需要编译、运行和解析。同样,go 命...阅读全文

知乎专栏 2018-02-23 00:00:18 缪斯的情人

Serverless 架构:享受纯粹的编程乐趣

王晓波 / 同程旅游首席架构师专注于高并发互联网架构设计、分布式电子商务交易平台设计、大数据分析平台设计、高可用性系统设计,基础云相关技术研究,对 Docker 等容器有深入的实践。前言随着公司体系的不断庞大,各种服务越来越多,程序员往往需要操心很多代码以外的事情如资源申请、环境配置、性能安全等,导致了开发效率低下。在ECUG 10周年的大会上,同程旅游的首席架构师王晓波分享了同程旅游从传统架构转变为微服务架构,再从微服务架构转变为Serverless架构这个过程中的一些经验,旨在让程序员的开发...阅读全文

微信公众平台 2018-02-22 王晓波

语义导入版本控制

本文译自 Semantic Import Versioning, Go & Versioning 的第 3 部分, 版权@归原文所有. 如何将不兼容的更改部署到现有软件包 ? 这是任何包管理系统中的根本挑战和决断. 问题的答案决定了所产生的系统的复杂性, 它决定了如何轻松或难以使用包管理. (它还决定如何轻松或难以实现包管理, 但用户体验更重要.) 为了回答这个问题, 这篇文章首先介绍了 Go 的导入兼容性规则: 如果旧包和新包具有相同的导入路径, 新软件包必须向后兼容旧软件包. 我们从 Go ...阅读全文

版本化 Go 之旅

本文译自 A Tour of Versioned Go (vgo), Go & Versioning 的第 2 部分, 版权@归原文所有. 对我而言, 设计意味着构建, 拆除和再次构建, 一遍又一遍. 为了编写新的版本控制提案, 我构建了一个原型 vgo, 来处理许多细微的细节. 这篇博文展示了如何使用 vgo. 你现在可以通过运行 go get golang.org/x/vgo 下载并尝试 vgo. Vgo 是 go 命令的一个直接替换(和分支拷贝). 你运行 vgo 而不是 go, 它将使用...阅读全文

lingchao.xin 2018-02-22 11:01 lingchao

Go += 包版本

本文译自 Go += Package Versioning, Go & Versioning 的第 1 部分, 版权@归原文所有. 我们需要将包版本控制添加到 Go. 更确切地说, 我们需要将软件包版本的概念添加到 Go 开发人员和我们的工具的工作词汇表中, 以便在彼此交谈时准确地确定应该构建, 运行或分析哪个程序. go 命令需要能够告诉开发人员具体哪些版本的软件包在特定构建中, 反之亦然. 版本控制可以让我们启用可重复构建, 所以如果我告诉你试用我的程序的最新版本, 我知道你将不仅获得我的代...阅读全文

lingchao.xin 2018-02-21 15:01 lingchao

Go JSON 技巧

相对于很多的语言来说, Go 的 JSON 解析可谓简单至极. 问题 通常情况下, 我们在 Go 中经常这样进行 JSON 的解码: package main import "encoding/json" // jsonText comes from http://json.org/example.html var jsonText = []byte(` { "glossary":{ "title":"example glossary", "GlossDiv":{ "title":"S", "G...阅读全文

lingchao.xin 2018-02-10 14:30 lingchao