Golang

Golang单元测试

参考几篇文章后,简单的进行了实践。感觉可以作为以后使用 golang 开发时,单元测试的固定套路。 首先介绍下这几个库 goconvey 可以作为单元测试框架。提供web界面管理测试,不仅可以看到单元测试的成功失败,还可以看到测试的覆盖率。而且启动goconvey以后,可以在文件修改后,自动进行测试。 gostub 在测试过程中,根据需求动态修改全局变量的值(比如,使用测试专用的配置文件),根据需求指定某个函数的返回值。(专业术语叫打桩???) gomock 专门用来测试接口的工具。可以根据接口定义来生成一个实现了接口的mock结构体。不过这个mock结构体上接口的每个函数返回值都需要根据测试来指定,这个mock结构体,可以在测试中使用。 goconvey 安装 go get github.com/smartystreets/goconvey 启动测试框架 cd $GOPATH/src/github.com/asdfsx/codility goconvey 通过浏览器访问 http://127.0.0.1:8080/ 可以看到测试结果。更改上面的地址可以对不同目录下的代码进行测试。 goconvey 可以直接支持 golang 的 testing 模块。但是为了获得更好的输出,可以使用goconvey的api对测试进行包装 import( . "github.com/smartystreets/goconvey/convey" "testing" ) func TestDB2(t *testing.T){ ... Convey("CreateConnection", t, func(){ dbConn, err = CreateConnection() So(err, ShouldEqual, nil) }) ... ) gostub 安装 go get github.com/prashantv/gostub 在测试的过程中,需要根据情况调整配置和一些全局变量,gostub 就是用来做这个的(打桩?)。 import ( "testing" . "github.com/prashantv/gostub" ) var ( MYSQLUSER string MYSQLPASSWORD string MYSQLADDR string MYSQLPORT int DATABASENAME string ) func Test1(t *testing.

Golang的类型

两个月前给自己挖的坑,就这么算是填上了吧。其实最重要的还是多看代码、多写代码。本文参考 Golang Specification 和 The way to go。 常量 常量声明 const Pi float64 = 3.14159265358979323846 const zero = 0.0 // untyped floating-point constant const ( size int64 = 1024 eof = -1 // untyped integer constant ) const a, b, c = 3, 4, "foo" // a = 3, b = 4, c = "foo", untyped integer and string constants const u, v float32 = 0, 3 // u = 0.

使用swarm在mac上搭建开发环境

源起 docker并不是新技术。作为 golang 社区内的旗舰级的项目,从诞生之初就吸引了很多人的瞩目,甚至可以说是获得了所有 golang 社区的人多瞩目吧。同时对推广 golang 也起了很大的作用。作为从一直关注着 golang 的人,大概2年前就开始尝试使用它了。不过由于其依赖 linux 的多项特性,导致在 mac 上使用必须要借助虚拟机,体验总是要差一点。最近经人提醒发现新的 docker for mac 可以不借助虚拟机就可以在 mac 上提供与 linux 上同样的体验,大喜!遂卸载虚拟机,打算用新软件搭个测试环境玩耍一下。 安装 超级简单,照着说明来就好。顺便装上了 kitematic。这个确实也非常好用。 目标 将一套以前用 python 实现的 kafka producer程序,移植到 golang 上。测试新程序的异常情况处理(特指连接失败的处理)。 然后就被坑掉了。 坑1 网络的问题 最初只是想通过 docker 启动一个单点的 kafka,程序通过本地网络直接访问就可以了。通过之前安装的 kitematic 从 hub.docker.com 上下载了 spotify/kafka 镜像,并直接启动容器。通过kitematic连接到容器内,各项命令执行正常。但是执行程序的时候却发现,总是第一次连接成功后,后边的所有连接都是失败的。通过日志发现程序在第一次成功连接 kafka 之后,连接地址发生了变更,变成了容器内部的地址(直观的现象就是,端口从 kitematic 随机生成的 12345 变成了 9092)。然后又尝试了手动用 –net=host 方式启动,结果彻底连不上了。 在对 github.com/shopify/sarama 简单的分析以后,发现它的连接过程是这样的: 首次连接,根据配置信息连接服务器 连接成功后,从服务器获取broker信息 根据获得到的broker信息,连接其余的broker 问题就出现在最后一步上,服务器返回的broker信息中,网络地址都是容器内部的网络,没有办法从容器网络外部直接连接的。 通过在github上查 issue, google 上查资料,有了以下不负责任的猜想:

Golang代码组织结构

结合官方的文档,还有《The way to go》先来熟悉一下golang的代码结构。以下来自官方文档 Go programs are constructed by linking together packages. A package in turn is constructed from one or more source files that together declare constants, types, variables and functions belonging to the package and which are accessible in all files of the same package. Those elements may be exported and used in another package. Each source file consists of a package clause defining the package to which it belongs, followed by a possibly empty set of import declarations that declare packages whose contents it wishes to use, followed by a possibly empty set of declarations of functions, types, variables, and constants.

Golang开发环境设置

开发环境的设置 老调重提,先搞定使用环境再说怎么用 关于安装,下载最新版的golang安装包,安装就好。这里重点说说环境变量的配置,摘抄一段《The way to go》里的一段 $GOROOT 表示 Go 在你的电脑上的安装位置,它的值一般都是 $HOME/go , 当然,你也可以安装在别的地方。 $GOARCH 表示目标机器的处理器架构,它的值可以是 386、amd64 或 arm。 $GOOS 表示目标机器的操作系统,它的值可以是 darwin、freebsd、linux 或 windows。 $GOBIN 表示编译器和链接器的安装位置,默认是 $GOROOT/bin ,如果你使用的是 Go 1.0.3 及以后的版本,一般情况下你可以将它的值设置为空,Go 将会使用前面提到的默 认值。 目标机器是指你打算运行你的 Go 应用程序的机器。 Go 编译器支持交叉编译,也就是说你可以在一台机器上构建运行在具有不同操作系统和处理 器架构上运行的应用程序,也就是说编写源代码的机器可以和目标机器有完全不同的特性 (操作系统与处理器架构)。 为了区分本地机器和目标机器,你可以使用 $GOHOSTOS 和 $GOHOSTARCH 设置目标机器的参 数,这两个变量只有在进行交叉编译的时候才会用到,如果你不进行显示设置,他们的值会 和本地机器( $GOOS 和 $GOARCH )一样。 $GOPATH 默认采用和 $GOROOT 一样的值,但从 Go 1.1 版本开始,你必须修改为其它 路径。它可以包含多个包含 Go 语言源码文件、包文件和可执行文件的路径,而这些路径 下又必须分别包含三个规定的目录: src 、 pkg 和 bin ,这三个目录分别用于存放源 码文件、包文件和可执行文件。 $GOARM 专门针对基于 arm 架构的处理器,它的值可以是 5 或 6,默认为 6。 $GOMAXPROCS 用于设置应用程序可使用的处理器个数与核数 其中最常用的就是GOPATH。你可以只设置一个GOPATH,然后把所有的项目都放在这个目录下。

Golang重新从零开始之旅

第一次接触golang还是在4年前?当时的版本大概是0.9? 当时刚用python完成了一个ETL的项目。为了压榨机器的性能,python多进程是必不可少的。于是再一次被多进程搞得痛不欲生,内存的浪费(每个进程都要加载相同的数据),多进程之间的协同(硬是塞了多个队列到各个进程里),还有时不时出现的僵尸进程。虽然我仍然十分喜欢python,但是这些始终解决不了的问题,让我生出了寻找一个替代品的想法。 最初是打算使用erlang的。其实当时接触erlang有一阵子了,对于erlang的语法什么的也算比较熟。但是最后还是放弃了,原因就是对于语言的偏好吧:对于一个习惯了python中简单方便的使用list、map进行各种组合的人来说,erlang的数据结构用起来太麻烦了;另外就是感觉erlang的社区有一种很封闭的感觉?提到erlang,多说一句,这确实是个很好的语言,有很多非常好的特性,但是始终非常小众,原因我不认为是什么函数式语法的问题,更多的问题我觉得是社区吧。 在使用erlang重新实现了一部分python的功能模块之后,我终于放弃了蛋疼的一个个把python的map改成erlang的proplists,放弃了一个个把python中的for循环改成erlang中的尾递归。这个时候我遇到了golang。 最初如何发现golang的已经记不清了。随着了解的加深,对这门语法简单、性能不错,并发容易实现的语言,产生了很强的好感。随着golang社区的重磅项目陆续诞生,甚至认为可以在分布式计算领域诞生一个可以替代hadoop的项目。不过目前来看社区的主要发展方向好像还是基础设施的建设上,重磅的项目还是主要集中在容器、集群管理、监控这个方向。虽然对这个语言很有好感,但是可惜的是还是没有用起来。只是还持续的关注着golang和golang的社区。 最近开始看rust,想着把golang也重新拿来把玩一番,于是有了这堆牢骚。多余的不说,只是希望能把golang重新熟悉一下。顺便熟悉熟悉用hugo搭blog,熟悉熟悉markdown,熟悉熟悉whatever。