tour
Go的基本语言及数据结构学习,可参照Go 指南。
其中有部分联系题,练习题答案参照夏令blog
安装tour
包
其中部分练习题需要引用tour
下的文件,如练习:map该题中,官方给的参考代码为:1
2
3
4
5
6
7
8
9
10
11
12
13package 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
2package 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
19package 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
3test.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
19package 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
12PASS
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,但有的细节没更改完成导致的。