安装golang

https://golang.org/dl/
下载最新的版本,go17 unstable

执行 go env 会输出go的环境变量,说明安装成功

Go Modules

之后我们来了解go的包管理
类似PHP的composer,go也有自己的包管理工具,而且是自带的,不用像PHP一样另外安装composer

go mod 可以用来管理源码包及其版本。

mod 是 golang 1.11引入的新特性,在此之前是使用GOPATH来管理包的,那是一种很简陋的方式,只是规定了一个路径,go项目编译过程中回去里面寻找包而已。

这里也就是说有了go mod你就可以不关心go path了,其实不完全是这样子。

  1. GO111MODULE有三个值:off、on 和 auto(默认值) 在使用模块的时候,GOPATH 是无意义的,不过它还是会把下载的依赖储存在 $GOPATH/src/mod 中,也会把 go install 的结果放在 $GOPATH/bin 中。
    • GO111MODULE=off,无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包
    • GO111MODULE=on,模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖
    • GO111MODULE=auto,在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持

go mod 命令

  1. Usage:
  2. go mod <command> [arguments]
  3. The commands are:
  4. download download modules to local cache (下载依赖的module到本地cache))
  5. edit edit go.mod from tools or scripts (编辑go.mod文件)
  6. graph print module requirement graph (打印模块依赖图))
  7. init initialize new module in current directory (再当前文件夹下初始化一个新的module, 创建go.mod文件))
  8. tidy add missing and remove unused modules (增加丢失的module,去掉未用的module)
  9. vendor make vendored copy of dependencies (将依赖复制到vendor下)
  10. verify verify dependencies have expected content (校验依赖)
  11. why explain why packages or modules are needed (解释为什么需要依赖)
  12. Use "go help mod <command>" for more information about a command.

GOROOT

% go env GOROOT
/usr/local/go

标准库在 GOROOT 下,第三方会下载在 GOPATH 下,但如果用了 GOMODULE,GOPATH 以后就不用管了。
go的工具链中已经正确设置了 GOROOT,所以我们不用关心这个。

在尝试使用Goland开发的过程中,发现对 go17beta版本的支持不好,一直找不到GOROOT,于是将版本降为16稳定版

实例

go mod init shawn/gogogo
在目录下生成了一个 go.mod文件,里面是

module shawn/gogogo
go 1.16

我们新建一个main.go文件,

package gogogo

import (
    "net/http"
    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    e.Logger.Fatal(e.Start(":1323"))
}

go run main.go [22:43:48]package com
mand-line-arguments is not a main package (入口的package 包必须是main包)
main.go:5:2: no required module provides package github.com/labstack/echo; to add it:
go get github.com/labstack/echo (缺少依赖包,会自动装也可以手动安装)

go get github.com/labstack/echo
会发现 go.mod 的包增加了三个 require

module shawn/gogogo

go 1.17

require (
    github.com/labstack/echo v3.3.10+incompatible // indirect
    github.com/labstack/gommon v0.3.0 // indirect
    golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect
)

再执行 go run main.go就OK了

tal:gogogo/ $ go run main.go                                                                                                                                     [22:48:48]

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:1323

go get 升级

  • 运行 go get -u 将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
  • 运行 go get -u=patch 将会升级到最新的修订版本
  • 运行 go get package@version 将会升级到指定的版本号version
  • 运行go get如果有版本的更改,那么go.mod文件也会更改

参考

https://cloud.tencent.com/developer/article/1593734