前阵子 Kevin 跟我们分享了一波 Kotlin。
我感觉 Kotlin 很好玩,
于是想尝试一下。
但后来 张总 又问我,
你既然想玩一下 Kotlin,
那怎么不试一下 Go 呢?
我就去查了查 Kotlin VS Go
的这个话题,
发现 知乎上有人这么说:
Kotlin 的大优势和大劣势都是完全兼容 Java。 而 Go 最大优势就是对多线程的优化。
我又去看了看 Slant上面的对比。
嗯,感觉其实两个语言都很有前途啊!
然而 😉 我选择 Python Go...
值得一提的是,
GoLang
只是网站名,
有的时候 Google 搜 Go 不好搜,
也会用 GoLang 来搜索。
但 Go 语言没有别的名字,本身就叫 Go
好了,既然选择了 Go, 那我们首先从语言本身开始走起。
-
安装:因为我是 Windows 党, 所以用 Choco 安装 或者去官网下载 msi 装一下都行。
-
IDE:因为我是 IDE 党... 而且 [JetBrains 也出了 Go 的 IDE Gogland][https://www.jetbrains.com/go/] 那自然就是选择它了。
-
语法学习:认识新语言的语法, 我首先就会去 Learn X In Y Minutes 上看看…… 然后再稍微看了看官方的 Go Tour。
注: 这里十分蛋疼地发现 Go 是推崇 Tabs 的... 我思索了一下,决定
还是用 Space入乡随俗,使用 tabs。
百看不如一练, 直接上手用吧。
首先我们新建一个Project, 等等, 问题来了, Go 语言的 Workspace 一般是什么样子?
一般来说,项目目录下面会有三个文件夹:src, pkg, bin。
其中 src 是放源文件的,pkg 是放各种
内裤类库、包的,bin是放可执行文件的。而项目一般是放在 home 目录下的。 假如你要放在其它目录, 你就要去设定一下 GOPATH 这个环境变量了。
噢,这里引入了一个新的词,
叫 GOPATH
。
再看看文档,
发现这个概念跟 Java 的 classpath、
Python 的 sys.path 很类似。
在我们用 go build
命令编译项目的时候,
在 $GOPATH/src
下面的源文件们就会被翻出来然后编译。
这里有几条命令可以跑跑看:
> go env
set GOROOT=C:\CodeEnv\Go # Go语言的安装路径
set GOPATH=C:\Code\github\LKI\go # 本项目的路径
...
> go env GOPATH # 只查看 GOPATH 这个环境变量
C:\Code\github\LKI\go
> go help gopath # 简单地看一看关于 GOPATH 的说明
The Go path is bla bla...
bla bla...
bla bla...
> go help build # 理论上这个也可以跑
usage: go build [bla bla] bla bla [packages]
> go build hi # 跑跑看
> hi
Hi, Lirian
在边玩边学中,
我们第一个程序就跑成功了。
我们可以试试各种各样的语法,
比如 defer
, error
等。
接下来我们尝试写一个 Low DB 那样的 json/in-memory database吧。 取个名,就叫…
首先我们要写一个 In Memory DB, 期待它的用法类似如下:
var db = fatedb.DB{}
db.Set("key", "value")
db.Get("key") // "value"
db.Get("no-such-key", "default") // "default"
db.Del("key")
db.Get("key") // nil
先不考虑 Thread Safe 的问题, 首先我们要解决的是 Go 里面 Dictionary/Map 要怎么写? 那自然是找一下官方的文档: Go maps in action
学到了 map 的用法以后, 为了解决 default value 的问题, 类比于 Python, 我们要看看有没有 Named Parameter 或者 Optional Parameter 的概念。 然而,很可惜, Go 并没有(或者说我目前没找到)对应的做法。 而且 Go 还不支持 method overloading... 哭,于是我们只能这么去实现了:
db.Get("key") // "value"
db.GetWithDefault("no-such-key", "default") // "default"
开始怀念起了 Python ...
然后是 map[string]string
的问题,
Go 里面有没有类似于 map[object]object
这样的表达呢?
查了一下,
可以用 map[interface{}]interface{}
来达到效果。
很神奇嘛,
那这个 interface 关键字又是干什么的呢?
TODO: 施工中...