Some notes for Golang
-
$GOPATH
为工作目录,它有点类似于Python的site-packages
,里面用于存放项目依赖的第三方代码。$GOPATH ├── pkg └── src ├── golang.org └── Example-project
-
对于某一个项目,代码一般不要放在
src
目录下,而是按照功能放置代码文件(比如和web相关的就放在web
文件夹内)。这一点和$GOPATH
不能混淆(refer)。 -
使用
go get
安装依赖之前需要使用go mod init
来初始化。 -
不同于JavaScript的NPM把依赖安装在各个项目目录下,Python可以通过virtualenv来隔离项目依赖,Go把所有的依赖都存放在工作目录下(这里只说Go官方支持的modules方式)。在每个项目下,使用
go.mod
和go.sum
文件来标识项目所需的依赖,对于同一个依赖,会根据其version和commit来放置到不同的文件夹。因此,同一个依赖在$GOPATH
下可能会有很多份不同版本的代码。(这样虽然可能复用之前安装过的依赖,但如何有效地清除那些已经不再需要的依赖呢?) -
对比Python:
-
Go没有set数据结构(原因么看这里),要实现一个集合可以这样:
var mySet = map[string]bool {} mySet["a"] = true // Add "a" _, ok = mySet["b"] // Check if "b" exist
-
Go不支持方法定义时给参数默认值(by design,see here), 看到的比较好的替代方案是这样的:
type Params struct { a, b, c int } func doIt(p Params) int { return p.a + p.b + p.c } // you can call it without specifying all parameters doIt(Params{a: 1, c: 9})
-
-
Go的module用
init
函数可以做一些初始化的工作,而struct的并不存在初始化的特殊函数,如果想要在struct生成时做些初始化操作,可以使用一个额外的工厂函数来生成该struct:type Person struct { name string age int } func NewPerson(name string, age int) { // Do some init work return &Person{name, age} }
-
Go标准库对xml或json的解析都需要提前定义好它的format,比如说对于xml:
var body = `<response> <sessionKey>exuOpep4^t^oJRtf1JCAfnlIAhDK76ZlMTwP6uWZwXebJ_NRsh8qUBUpxM7LNtOi8Tt6J9DUvdcQdb1r9y8a^V</sessionKey> <messages> <msg code=""></msg> </messages> </response> ` // Define the format var xmlBody struct { SessionKey string `xml:"sessionKey"` } if err := xml.Unmarshal([]byte(body), &xmlBody); err != nil { log.Fatal(err) } // Parsing result fmt.Println(xmlBody.SessionKey)