导论

Let's Go

Go 最大的特色就是在语言层面天生支持并发,不需要像其他大多数编程语言那样需要开发者自行实现或借助第三方类库实现并发编程,Go 在语言级别支持的并发编程,其逻辑简化得通俗易懂简单好上手。

应用场景

  • 系统应用:以前要用 C/C++ 做的系统应用,现在都可以用 Go 来写,事半功倍,而且 Go 完美包容 C 源代码,两者互相调用还可以混合编译从而无缝集成。

  • 网络应用:包含了常见的服务端编程比如 Web 和 API Service,以前用 PHP / Python / Ruby / Java 干的事情现在都可以用 Go 更加简单清晰的来写。再比如还可以拿来做一些 Proxy(代理)如网络穿透软件等,你懂的。

  • 分布式系统:基于 Go 强大的系统编程加网络编程,打造各种跨网络的分布式系统服务,Go 社区有不少和分布式系统相关的开源产物。

  • 各种形态的存储和数据库应用:比如 groupcache,influxdb 等。

  • 客户端应用:包括带界面的桌面软件,以及后续可以想像的移动端应用(比如对 Android 的支持)。

  • 云服务(PaaS):如基于 Go 打造的七牛云存储(分布式对象存储系统),比如基于 Go 编写的 Docker(一款开源的容器虚拟化产物)。

HelloWorld

package main
import "fmt"
func main() {
fmt.Printf("Hello, world or 你好,世界 or καλημ ́ρα κóσμ or こんにちはせかい\n")
}

首先我们要了解一个概念,协程序是通过 package 来组织的。package 这一行告诉我们当前文件属于哪个包,而包名 main 则告诉我们它是一个可独立运行的包,它在编译后会产生可执行文件。除了 main 包之外,其它的包最后都会生成*.a 文件(也就是包文件)并放置在$GOPATH/pkg/$GOOS_$GOARCH中(以 Mac 为例就是$GOPATH/pkg/darwin_amd64)。

每一个可独立运行的 协程序,必定包含一个 package main,在这个 main 包中必定包含一个入口函数 main,而这个函数既没有参数,也没有返回值。为了打印 Hello, world...,我们调用了一个函数 Printf,这个函数来自于 fmt 包,所以我们在第三行中导入了系统级别的 fmt 包:import "fmt"。包的概念和 Python 中的 package 类似,它们都有一些特别的好处:模块化(能够把你的程序分成多个模块)和可重用性(每个模块都能被其它应用程序反复使用)。

最后大家可以看到我们输出的内容里面包含了很多非 ASCII 码字符。实际上,Go 是天生支持 UTF-8 的,任何字符都可以直接输出,你甚至可以用 UTF-8 中的任何字符作为标识符。

目录结构

通过上面建立的我本地的 mygo 的目录结构如下所示

xml
bin/
mathapp
pkg/
平台名/ 如:darwin_amd64、linux_amd64
mymath.a
github.com/
astaxie/
beedb.a
src/
mathapp
main.go
mymath/
sqrt.go
github.com/
astaxie/
beedb/
beedb.go
util.go

从上面的结构我们可以很清晰的看到,bin 目录下面存的是编译之后可执行的文件,pkg 下面存放的是应用包,src 下面保存的是应用源代码