03《Go语言入门》GoPath 和 GoRoot简介
先是简单介绍了上一篇文中写的Hello, World程序的代码,然后抛出程序如何找到fmt包这个问题,而该问题就涉及到GoPath和GoRoot。
通过GoPath讲了如何引用GitHub上的包,并分析了在测试过程中执行 go run XXX_test.go
报错的问题。
这是我纯手写的《Go语言入门》,手把手教你入门Go。源码+文章,看了你就会🥴!
文章中所有的代码我都放到了github.com/GanZhiXiong/go_learning这个仓库中!
看文章时,对照仓库中代码学习效果更佳哦!
Hello World程序的过程是怎样的?
通过上一篇文章,我们编写了第一个Go程序,那么这个代码过程又是怎样的呢?
这里还是把代码再贴出来:
1 | package main |
- 第一行代码:建立一个名为main的package,这里的package和Java里面的package是类似的。
- 第二行代码:导入“fmt”这个包,用于调用Println这个函数。
- 第三行代码:写一个main()函数。
那么问题来了,“fmt”包是怎么找到的呢?
这里就需要我们了解GoRoot和GoPath了。
GoPath和GoRoot
GoPath是Go的工作目录
GoRoot是Go的安装目录
使用go env
命令可以查看GoPath和GoRoot
GoRoot
fmt包正是通过GoRoot下的src目录找到,在src目录下面我们可以看到有内置的包和函数,如fmt、math、strings等。
如果我想是用GitHub上的开源包,该怎么使用呢?
那就得用到GoPath了
GoPath
GoPath目录约定了三个子目录
- src:存放源代码。
go run
、go install
等命令会在此路径下执行 - pkg:存放编译时生成的中间文件(*.a)
- bin: 存放编译后生成的可执行文件(执行
go install
,会在bin目录下生成可执行文件)
引用GitHub上的包
我们要引用GitHub上github.com/gomodule/redigo/redis
这个包用进行Redis的操作,该怎么引用呢?
- 执行
go get github.com/gomodule/redigo/redis
获取包
获取后,会在GoPath的src目录下生成一个/github.com/gomodule/redigo
这样的目录(如果从未运行go get
命令,GoPath目录是空的) - 在项目中引用
创建redis_test.go文件
将下面代码写入到redis_test.go1
2
3
4
5
6
7
8
9
10
11
12
13
14package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
fmt.Println("redis connect succ")
defer c.Close()
}
go run: cannot run *_test.go files
执行go run redis_test.go
竟然报错了,这是你可能会觉得是代码的问题。🥴🥴🥴
你错了。这不是错误,它是这样设计的。
go run将检测_test文件并将其视为程序包的测试文件,测试文件将被编译为单独的程序包,然后与主要测试二进制文件链接并运行。
详情见testing system
您不能将程序文件命名为* _test.go,因为这是集成的Go测试系统的一部分
要编写一个新的测试套件,请创建一个名称以_test.go结尾的文件,其中包含TestXxx函数,如此处所述。 将文件与要测试的文件放在同一软件包中。 该文件将从常规软件包生成中排除,但在运行“ go test”命令时将包括在内。 有关更多详细信息,请运行“ go help test”和“ go help testflag”。
参考go not running program with name package_test.go
解决:
你只需要将redis_test.go
文件名中的test前面的下划线去掉或使用其他名称即可解决
03《Go语言入门》GoPath 和 GoRoot简介