Go是你可以信任的聪明的人设计的一个可爱小巧的编程语言 ,并且由一个不断增长的巨大开源社区进行持续的完善和提高 。

Go意味着简单, 但有时它的约定可能有点难以理解。 我想告诉你我如何开始我的Go项目,以及如何使用Go的常规用法。 让我们构建一个web应用程序的后端服务。

设置您的环境

当然,第一步是安装Go。 您可以从官方网站为 您的操作系统安装使用二进制发行版 。 如果你在Mac上使用自制程序, brew install go很起作用。 当你完成安装,这应该工作:

$ go version
go version go 1.3.1 darwin/amd64

一旦安装完成,唯一另外要做的是设置GOPATH。 这是根目录,将保留你所有的Go代码,建立artifacts。 这个Go工具将在你的GOPATH创建三个子目录:bin,pkg和src。 有些人把它设置成 $ HOME /go,但我更喜欢简单的 $ HOME。确保它能导出到您的环境。如果你使用bash,下面所示的代码应该工作:

$ echo 'export GOPATH=$HOME' >> $HOME/.profile
$ source $HOME/.profile
$ go env | grep GOPATH
GOPATH="/Users/peter"

Go有很多可用的编辑器和插件。 我个人是Sublime Text和优秀的 GoSublime插件的狂热粉丝。 但是语言是非常简单直白的,特别是对于一个小项目,一个纯文本编辑器是绰绰有余的。 我和一群专业的,全职Go开发人员一起工作,他们仍然使用vanilla vim,甚至没有语法高亮显示。 要开始开发Go程序,你肯定不再需要更多的东西。 像往常一样,简单就是王道。

一个新项目

在运作环境中,我们将给这个项目创建一个新的目录。Go工具链期望所有的源代码存在于GOPATH / src,所以我们总是在这个路径下工作。 工具链也可以直接导入和托管在GitHub或Bitbucket等网站上的项目互动,前提是假设他们放在正确的地方。

对于这个示例, 在GitHub创建一个新的空的库。 我将假定它叫做“hello”。 然后,在$GOPATH路径下为它创建一个主页。

$ mkdir -p $GOPATH/src/github.com/your-username
$ cd $GOPATH/src/github.com/your-username
$ git clone git@github.com:your-username/hello
$ cd hello

太好了。 创建 main.go,这将是我们的绝对最小Go程序。

package main
func main() {
    println("hello!")
}

调用 go build编译当前目录下的所有文件。 它会产生一个和这个目录名称相同的二进制。

$ go build
$ ./hello
hello!

简单! 即使编写Go应用程序几年后,我都像这样开始我所有的新项目。 一个空的git存储库,a  main.go,一点点的打字。

因为我们注重遵循共同的约定,您的应用程序是可以自动的 go get. 如果你承诺,把这个单一文件放到GitHub, 任何一个安装过Go的人应该可以这样做:

$ go get github.com/your-username/hello
$ $GOPATH/bin/hello
hello!

创建web服务器

让我们把我们的hello,world变成一个web服务器。 这是完整的程序。

package main
import "net/http"
func main() {
    http.HandleFunc("/", hello)
    http.ListenAndServe(":8080", nil)
}
func hello(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("hello!"))
}

有一点需要拆包。 首先,我们需要从标准库包导入 net/http 。

import "net/http"

然后,在主函数中,我们在网络服务器的根路径下安装一个处理函数。 http.HandleFunc 操作缺省HTTP路由器,一般称为 ServeMux。

http.HandleFunc("/", hello)

函数hello,是一个 http.HandlerFunc ,这意味着它有一个特定类型签名,并可以作为参数传递给HandleFunc。 每次和根路径相匹配的一个新的请求到达HTTP服务器时,服务器将生成一个新的goroutine执行hello函数。 hello函数简单地使用 http.ResponseWriter 写一个响应给客户端。 因为http.ResponseWriter.Write取用更普遍的 []byte或byte-slice作为参数,我们做一个简单的字符串类型转换。

func hello(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("hello!"))
}

最后,我们通过 http.ListenAndServe 用默认的ServeMux启动HTTP服务器的8080端口。这是一个同步,或阻塞调用,这将保持这个项目一直运行直到被中断。 编译和运行和之前一样。

$ go build
./hello

在另一个终端,或您的浏览器,创建一个HTTP请求。

$ curl http://localhost:8080
hello!

简单! 没有安装框架,没有依赖下载,没有创建任何项目架构。甚至二进制本身是原生代码,静态链接的,没有运行时依赖关系。 另外,标准库的HTTP服务器是产品级的,可以防御常见的攻击。 它可以直接为在线网络提供服务请求。