1. Go并发编程基础(译)

    原文:Fundamentals of concurrent programming

    译者:youngsterxyf

    本文是一篇并发编程方面的入门文章,以Go语言编写示例代码,内容涵盖:

    • 运行期并发线程(goroutines)
    • 基本的同步技术(管道和锁)
    • Go语言中基本的并发模式
    • 死锁和数据竞争
    • 并行计算

    在开始阅读本文之前,你应该知道如何编写简单的Go程序。如果你熟悉的是C/C++、Java或Python之类的语言,那么 Go语言之旅 能提供所有必要的背景知识。也许你还有兴趣读一读 为C++程序员准备的Go语言教程为Java程序员准备的Go语言教程

    1. 运行期线程

    Go允许使用go语句开启一个新的运行期线程,即 goroutine,以一个不同的、新创建的goroutine来执行一个函数。同一个程序中的所有goroutine共享同一个地址空间。

    Goroutine非常轻量,除了为之分配的栈空间,其所占用的内存空间微乎其微。并且其栈空间在开始时非常小,之后随着堆存储空间的按需分配或释放而变化。内部实现上,goroutine会在多个操作系统线程上多路复用。如果一个goroutine阻塞了一个操作系统线程 …

    Tagged as : 翻译 Golang
  2. 如何实现Golang的http请求处理中间件(译)

    原文:Golang Http Handlers as Middleware

    译者:youngsterxyf

    大多数现代Web组件栈允许通过栈式/组件式中间件“过滤”请求,这样就能干净地从web应用中分离出横切关注点(译注:面向方面程序设计中的概念?)。 本周我尝试在Go语言的http.FileServer中植入钩子,发现实现起来十分简便,让我非常惊讶。

    让我们从一个基本的文件服务器开始说起:

    func main() {
        http.ListenAndServe(":8080", http.FileServer(http.Dir("/tmp")))
    }
    

    这段程序会在端口8080上开启一个本地文件服务器。那么我们该如何在这其中植入钩子从而能够在文件请求处理之前执行一些代码?来看一下http.ListenAndServe的方法签名:

    func ListenAndServe(addr string, handler Handler) error
    

    看起来http.FileServer返回了一个Handler …

    Tagged as : Golang 翻译 中间件
  3. 为何Goroutine的栈空间可以无限大?(译)

    原文:Why is a Goroutine's stack infinite?

    译者:youngsterxyf

    Go编程新手可能会偶然发现Go语言---与一个Goroutine可用栈空间大小相关---的一个古怪特性。这通常是由于程序员 无意间构造了一个无限递归函数调用而产生的。为了阐明这个特性,以如下代码(有点刻意设计的)为例。

    package main
    
    import "fmt"
    
    type S struct {
        a, b int
    }
    
    // String implements the fmt.Stringer interface
    func (s *S) String() string {
        return fmt.Sprintf("%s", s)     // Sprintf will call s.String()
    }
    
    func …
    Tagged as : Golang 翻译
  4. Go - 以任意类型的slices作为输入参数(译)

    原文:Go – taking slices of any type as input parameters

    译者:youngsterxyf

    最近参与的一个业余项目,go-linq,让我了解到Go语言的类型系统并不是为任何类面向 对象编程而设计的。没有泛型,没有类型继承,也没有提供任何对这些特性有用的东西。

    但是,提供了一个名为interface{}的类型,你可以向其赋予几乎任意类型的值,不会抛出编译错误,就像.NET的Object或Java的Object

    var o interface{}
    o := 3.14
    o := Student{Name: "Ahmet"}
    

    我们假设你需要一个可以接收任意类型slices的函数,如果考虑如下这样实现:

    func Method(in []interface{}){...}
    ...
    slice := []int{1, 2 …
    Tagged as : Golang 翻译
  5. 仓库作业机器监控系统设计与实现

    近期在参与一个仓库作业机器监控项目。该项目的需求背景是:公司的电商业务在全国各地有多处或大或小的仓库,仓库的作业人员(没有IT技术背景)经常反馈/投诉作业机器断网、断电、连不了服务等问题。实际情况经常与反馈的不一致,但运维侧并没有数据可以证明,所以才有了这个项目的需求。

    该项目第一期的目标仅是收集、展示作业机器某些监控指标数据,以便在快速定位解决问题,或至少有数据可查

    为了避免大量监控数据上报影响到生产系统的网络服务,系统采用如下结构:

    inner_warehouse_monitor

    1. 实现一个agent用于在仓库作业PC或作业PDA上获取机器的监控数据;
    2. 在仓库本地服务器上实现一个数据收集处理服务,提供API给agent上传监控数据;数据收集处理服务会将接收到的数据持久化到数据库,提供给仓库本地服务器上的webApp进行数据展示等;
    3. 中心服务器可以调用各个仓库本地服务器上的webApp提供的数据查询接口(数据用于定位、发现问题);定期按需对各个仓库本地服务器上的数据进行归档。

    这样,主要的工作都集中在作业机器上的agent数据收集处理服务、webApp。这其中最关键的又是数据收集处理服务。考虑到需要多地部署运维仓库本地服务器,而且某些大仓库作业机器的数目目前已多达800-1000,我们做了如下技术选型:

    1. Golang实现agent、数据收集处理服务、webApp;
    2. 以SQLite作为数据库来存储agent上报的所有数据;
    3. NSQ作为异步消息队列中间件;

    选用Golang的理由是:可以静态编译,部署简单,只需将编译好的可执行二进制程序丢到服务器上跑起来就可以了 …

    Tagged as : 技术 总结 笔记 Golang
  6. Golang中如何让html/template不转义html标签

    近期在使用Golang的net/httphtml/template开发一个简单的HAProxy负载均衡任务管理系统(见搭建高可用负载均衡组件及缓存DNS一文说明)。

    htmp/template在渲染页面模板的时候默认会转义字符串中的html标签,但有时我们并不想转义html标签,以下图所示为例:

    add_haproxy_balance_task

    list_haproxy_balance_task

    图1中“ip:port列表(一行一个)”和“说明”两个输入框的内容行与行是以\n分隔的;图2中,这两部分内容分别在表格的“后端机器列表”和“说明”两列中展示,但行与行其实是以<br />分隔的;那么在将数据存入数据库之前或从数据库中取出数据后,会将字符串中的\n替换为<br />。如果将替换后的数据以字符串类型传入模板,<br />标签渲染后的效果就是<br />文本而不是换行。

    有两种方式避免html/template转义html标签:

    1. 把字符串类型数据转换成template …

    Tagged as : Golang template
  7. 运营开发规范化

    今年3月底毕业,入职腾讯做运营开发,至今6个月有余。入职之时组内仅有1个运营开发的同事,到目前已扩充到5人,加3个实习生。

    入职之时的运营开发过程是这样的:

    1. 在办公机器(Windows)上编写代码,功能测试通过后,
    2. ssh远程连接到生产服务器(Linux),vim打开一个新文件,复制办公机器上的代码,粘贴到vim中,保存,
    3. 打开浏览器测试上线的功能/效果是否正确,若不正确,
    4. 直接在生产服务器上编辑代码文件,直到达到需要的功能效果,
    5. 再从生产服务器上将修改后的代码复制粘贴到办公机器(也许不会有这一步,之后所有的修改都直接在生产服务器上操作)。

    这个过程存在如下问题:

    1. 代码没有版本控制
    2. 没有与生产服务器一致的测试环境
    3. 代码部署过程繁琐
    4. 办公开发机器上代码很可能比生产服务器上代码还旧
    5. 上面4点都会导致混乱

    除此之外,当团队从1人扩充到多人后,不可避免地会遇到协作的问题,解决代码开发协作问题一般涉及如下几方面:

    1. 使用代码版本控制
    2. 规定版本控制的工作流
    3. 编码规范
    4. 项目/代码文档
    5. 定期code review

    为了解决上述问题,我陆续地做了如下工作:

    搭建Gitlab服务器、测试服务器

    个人认为开发工作规范化的第一点就是版本控制,基于版本控制可以完成很多自动化的任务。

    平时个人的代码、文档都通过Git版本控制存放在Github上 …

Page 1 / 1