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
2
3
4
5
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
  • 第一行代码:建立一个名为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 rungo install等命令会在此路径下执行
  • pkg:存放编译时生成的中间文件(*.a)
  • bin: 存放编译后生成的可执行文件(执行go install,会在bin目录下生成可执行文件)

引用GitHub上的包

我们要引用GitHub上github.com/gomodule/redigo/redis这个包用进行Redis的操作,该怎么引用呢?

  1. 执行go get github.com/gomodule/redigo/redis获取包
    获取后,会在GoPath的src目录下生成一个/github.com/gomodule/redigo这样的目录(如果从未运行go get命令,GoPath目录是空的)
  2. 在项目中引用
    创建redis_test.go文件
    将下面代码写入到redis_test.go
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package 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简介

https://ganzhixiong.com/p/86d4b7a7/

Author

干志雄

Posted on

2020-12-30

Updated on

2020-12-30

Licensed under

Comments