Go学习笔记(二):tutorial学习

tour

Go的基本语言及数据结构学习,可参照Go 指南
其中有部分联系题,练习题答案参照夏令blog

安装tour

其中部分练习题需要引用tour下的文件,如练习:map该题中,官方给的参考代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import (
"code.google.com/p/go-tour/wc"
)

func WordCount(s string) map[string]int {
return map[string]int{"x": 1}
}

func main() {
wc.Test(WordCount)
}

直接根据该参考代码无法运行,因为“code.google.com/p/go-tour/wc”为第三方包,需要先安装才能使用。

官方安装

在命令行中执行:

1
go get code.google.com/p/go-tour/wc

安装该tour包。
如果,你已经配置了VPN,可以成功,否则会被报错,如下:

1
2
package code.google.com/p/go-tour/wc: Get https://code.google.com/p/go-tour/source/checkout?repo=: dial tcp 74.
125.204.113:443: i/o timeout

提示很明显,即timeout(超时),大陆访问code.google被墙了。

GitHub安装

该tour同样托管在Github上,托管地址:https://github.com/golang/tour
然后通过该托管源码安装tour。
该问题有部分issue讨论,地址为:https://github.com/golang/go/issues/9976
总结实验后,可行的方式(中国大陆,windows环境)为:

安装tour

在命令行中输入:

1
go get github.com/golang/tour

可在$GOPATH下看到一个src的文件夹,里面即为GitHub上的代码,目录结构也与GitHub上相同。

使用tour

当前可使用get的代码完成练习:map,解答代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
"golang.org/x/tour/wc"
"strings"
)

func WordCount(s string) map[string]int {
result := map[string]int {}
f := strings.Fields(s)
for _, v := range f {
result[v] += 1
}
return result
}

func main(){
wc.Test(WordCount)
}

运行该代码,提示:

1
2
3
test.go:7:2: cannot find package "golang.org/x/tour/wc" in any of:
D:\Program Files (x86)\Go\src\golang.org\x\tour\wc (from $GOROOT)
D:\Go\repo\src\golang.org\x\tour\wc (from $GOPATH)

“golang.org/x/tour/wc”依旧不存在。由于我们使用GitHub上的代码,故import的路径也需要相应更改,更改之后的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
"strings"
"github.com/golang/tour/wc" //更为真实路径
)

func WordCount(s string) map[string]int {
result := map[string]int {}
f := strings.Fields(s)
for _, v := range f {
result[v] += 1
}
return result
}

func main() {
wc.Test(WordCount)
}

再次运行,依旧报错,提示:

1
test.go:6:2: code in directory D:\Go\repo\src\github.com\golang\tour\wc expects import "golang.org/x/tour/wc"

我们查看D:\Go\repo\src\github.com\golang\tour\wc.go源代码,发现其源代码package后有个注释,代码为:

1
2
3
4
5
6
7
// Copyright 2011 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package wc // import "golang.org/x/tour/wc"

import "fmt"

此处使用注释,规定了import的方式,由于我们的实际路径和此处不同,故此import建议应该被去除或换为我们自己的路径方式。
去除// import “golang.org/x/tour/wc”,然后再次运行代码:

1
go run test.go

得到正确结果,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
PASS
f("I am learning Go!") =
map[string]int{"I":1, "am":1, "learning":1, "Go!":1}
PASS
f("The quick brown fox jumped over the lazy dog.") =
map[string]int{"quick":1, "brown":1, "the":1, "dog.":1, "The":1, "jumped":1, "over":1, "lazy":1, "fox":1}
PASS
f("I ate a donut. Then I ate another donut.") =
map[string]int{"a":1, "donut.":2, "Then":1, "another":1, "I":2, "ate":2}
PASS
f("A man a plan a canal panama.") =
map[string]int{"A":1, "man":1, "a":2, "plan":1, "canal":1, "panama.":1}

总结:此处应该属于google code的代码迁移到Github,但有的细节没更改完成导致的。