Skip to content
/ go Public

我的 GoLang 试验田

Notifications You must be signed in to change notification settings

LKI/go

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 

Repository files navigation

我的 Go 旅程

Kotlin vs Go ?

前阵子 Kevin 跟我们分享了一波 Kotlin。 我感觉 Kotlin 很好玩, 于是想尝试一下。 但后来 张总 又问我, 你既然想玩一下 Kotlin, 那怎么不试一下 Go 呢? 我就去查了查 Kotlin VS Go 的这个话题, 发现 知乎上有人这么说

Kotlin 的大优势和大劣势都是完全兼容 Java。 而 Go 最大优势就是对多线程的优化。

我又去看了看 Slant上面的对比。 嗯,感觉其实两个语言都很有前途啊! 然而 😉 我选择 Python Go...

go-name

值得一提的是, GoLang 只是网站名, 有的时候 Google 搜 Go 不好搜, 也会用 GoLang 来搜索。

Go 语言没有别的名字,本身就叫 Go

Start my journey

好了,既然选择了 Go, 那我们首先从语言本身开始走起。

wtf-tabs

注: 这里十分蛋疼地发现 Go 是推崇 Tabs 的... 我思索了一下,决定还是用 Space入乡随俗,使用 tabs。

百看不如一练, 直接上手用吧。

Hi, Lirian

首先我们新建一个Project, 等等, 问题来了, Go 语言的 Workspace 一般是什么样子?

文档里面是这么说的

一般来说,项目目录下面会有三个文件夹:src, pkg, bin。

其中 src 是放源文件的,pkg 是放各种内裤类库、包的,bin是放可执行文件的。

而项目一般是放在 home 目录下的。 假如你要放在其它目录, 你就要去设定一下 GOPATH 这个环境变量了。

噢,这里引入了一个新的词, 叫 GOPATH。 再看看文档, 发现这个概念跟 Java 的 classpathPython 的 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吧。 取个名,就叫…

Fate DB

首先我们要写一个 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: 施工中...

Releases

No releases published

Packages

No packages published

Languages