美文网首页深入浅出golangGolang 入门资料+笔记Go
golang快速入门[7.1]-项目与依赖管理-gopath

golang快速入门[7.1]-项目与依赖管理-gopath

作者: 唯识相链2 | 来源:发表于2020-03-03 12:54 被阅读0次

    前文

    前言

    • 在之前文章中,我们介绍了go语言开发环境的配置
    • 在本章中,我们将介绍go语言的项目结构、项目管理以及依赖管理。在本文中,我们关注gopath

    gopath是什么

    • 在go语言开发环境配置文章中,我们介绍了配置gopathgoroot环境变量的步骤,但是并没有对其进行深入解释。可以在终端输入 go env 或者go env gopath查看具体的配置
    C:\Windows\system32> go env
    set GO111MODULE=
    set GOARCH=amd64
    set GOBIN=
    set GOCACHE=C:\Users\jackson\AppData\Local\go-build
    set GOENV=C:\Users\jackson\AppData\Roaming\go\env
    set GOEXE=.exe
    set GOFLAGS=
    set GOHOSTARCH=amd64
    set GOHOSTOS=windows
    set GONOPROXY=
    set GONOSUMDB=
    set GOOS=windows
    set GOPATH=C:\Users\jackson\go
    set GOPRIVATE=
    set GOPROXY=https://proxy.golang.org,direct
    set GOROOT=c:\go
    ...
    
    
    • 在go1.8之后,如果不指定gopath,则gopath是默认的。

    • 在mac,linux下为$HOME/go

    • windows 下为%USERPROFILE%\g

    • gopath 可以理解为go语言的工作空间,内部存储了src,bin,pkg 三个文件夹

    go/
    ├── bin
    ├── pkg
    └── src
    
    
    • $GOPATH/bin目录存储了通过go install安装的二进制文件。操作系统使用PATH环境变量来查找无完整路径即可执行的二进制应用程序。建议将此目录添加到全局PATH变量中
    • $GOPATH/pkg目录中,会存储预编译的obj文件(文件名根据操作系统的不同而不同,例如mac下为darwin_amd64),以加快程序的后续编译。大多数开发人员不需要访问此目录。后面还会介绍,pkg下的mod文件还会存储go module的依赖。
    • $GOPATH/src目录 存储我们项目的go代码。通常包含许多版本控制存储库(例如,由Git管理),每个存储库都包含了一个或多个package,每个package都在一个目录中包含一个或多个Go源文件。
    • 因此,整个路径看起来像是:
    go/
    ├── bin
         └── main.exe
    ├── pkg
         ├── darwin_amd64
         └── mod
    └── src
        ├── github.com
        │   ├── tylfin
        │   │   ├── dynatomic
        │   │   └── geospy
        │   └── uudashr
        │       └── gopkgs
        └── golang.org
            └── x
                └── tools
    
    
    • gopath具有多个作用,当我们想从github或其他地方获取go项目代码时,我们可以使用go get指令。 此时程序会默认的将代码存储到$GOPATH/src目录中。例如拉取go get github.com/dreamerjackson/theWayToGolang时,目录结构如下:
    go/
    ├── bin
    ├── pkg
    └── src
        └── github.com
               └── dreamerjackson
                         └── theWayToGolang
    
    
    • 当我们使用go get-u参数时,会将该项目以及项目所依赖的所有其他项目一并下载到$GOPATH/src目录中
    • gopath的另一个功能是明确package的导入位置。前文我们介绍过,go代码通过package进行组织,在helloworl程序中,我们导入了go语言内置的fmt package.当我们要导入第三方时应该怎么做呢?其实如果我们在项目中导入了一个第三方包,例如
    import "blue/red"
    
    

    实际引用的是$GOPATH/src/blue/red 文件中的代码。

    同理,如果导入为

    import "github.com/gobuffalo/buffalo"
    
    

    实际引用的是$GOPATH/src/github.com/gobuffalo/buffalo 文件中的代码。

    下面我们用一个例子来说明导入第三方包

    • 首先在$GOPATH/src中新建一个文件夹mymath,在文件夹中新建一个文件add.go
    » mkdir mymath
    » cd mymath
    » touch add.go
    
    

    add.go的内容如下,要注意导出的函数必须是首字母大写的,这是go语言的规则。

    package mymath
    
    func Add(a int, b int) int {
        return a + b
    }
    
    

    接着在$GOPATH/src中创建一个main.go文件,即可以完整的调用mymath包中的add函数。

    package main
    
    import (
        "fmt"
        "mymath"
    )
    
    func main() {
        result := mymath.Add(1, 2)
        fmt.Println("result:", result)
    }
    
    
    • 通过go run main.go 即可运行输出1+2的结果3

    gopath的优劣

    • 相比于其他语言繁琐的配置,go语言中的工作空间gopath配置相对简单,容易理解
    • gopath使得在文件系统组织整个代码更加简洁、结构化,但是限制在单一的工作空间中。
    • gopath并没有解决版本依赖的问题,而将其留给了其他工具去实现。正因为如此,gopath中的代码就是一个唯一的master分支,并且强制使用各个模块最新的代码。

    总结

    • 本文介绍了gopath的含义、功能、优劣、以及如何通过GOPATH来组织项目,导入第三方库。
    • 在go1.13之后,go官方已经开始全面拥抱go module.我们在下文中,将介绍go module的原理和用法,以及如何通过go module进行go语言的依赖管理与项目组织。

    参考资料

    更多原创文章干货分享,请关注公众号

    image

    加技术交流群请加微信(注明:交流群):ywj2271840211

    相关文章

      网友评论

        本文标题:golang快速入门[7.1]-项目与依赖管理-gopath

        本文链接:https://www.haomeiwen.com/subject/nbcclhtx.html