如果不设置,直接使用命令创建会报错,如下:

 

go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help mod

 

01、配置GO111MODULE=on环境变量:配置后,最好是重启一下电脑,以免没有生效,搞得自己很烦。

 

 

 

02、使用命令:go mod init   

 

 

 03、在go.mod文件中添加require:

 

 

04、在项目中执行命令:go mod download,执行后会生成go.sum文件:

 D:\Go\src\apple>
PS D:\Go\src\apple> go mod download
go: finding gopkg.in/yaml.v2 v2.2.2
go: finding github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c
go: finding github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57
go: finding golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2
go: finding golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6
go: finding golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421
go: finding go.opencensus.io v0.20.1
go: finding golang.org/x/exp v0.0.0-20190121172915-509febef88a4
go: finding google.golang.org/grpc v1.19.0
go: finding golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f
go: finding golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4
go: finding github.com/golang/protobuf v1.2.0
go: finding github.com/googleapis/gax-go/v2 v2.0.4
go: finding github.com/apache/thrift v0.12.0
go: finding github.com/golang/mock v1.2.0
go: finding honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a
go: finding cloud.google.com/go v0.34.0
go: finding golang.org/x/net v0.0.0-20180826012351-8a410e7b638d
go: finding golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e
go: finding honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099
go: finding github.com/google/martian v2.1.0+incompatible
go: finding github.com/google/go-cmp v0.2.0
go: finding github.com/hashicorp/golang-lru v0.5.0
go: finding golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be
go: finding golang.org/x/sys v0.0.0-20180830151530-49385e6e1522
go: writing stat cache: rename D:\Go\pkg\mod\cache\download\golang.org\x\sys\@v\v0.0.0-20180830151530-49385e6e1522.info689223850.tmp 
D:\Go\pkg\mod\cache\download\golang.org\x\sys\@v\v0.0.0-20180830151530-49385e6e1522.info: Access is denied. go: finding github.com/golang/mock v1.1.1 go: finding github.com/openzipkin/zipkin-go v0.1.6 go: finding github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b go: finding cloud.google.com/go v0.26.0 go: finding github.com/client9/misspell v0.3.4 go: finding github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f go: finding google.golang.org/api v0.3.1 go: finding github.com/prometheus/common v0.2.0 go: finding golang.org/x/sync v0.0.0-20181108010431-42b317875d0f go: finding github.com/Shopify/toxiproxy v2.1.4+incompatible go: finding github.com/onsi/ginkgo v1.7.0 go: finding github.com/eapache/go-resiliency v1.1.0 go: finding github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1 go: finding github.com/onsi/gomega v1.4.3 go: finding github.com/Shopify/sarama v1.19.0 go: finding golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5 go: finding github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a go: finding github.com/matttproud/golang_protobuf_extensions v1.0.1 go: finding github.com/gorilla/context v1.1.1 go: finding github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d go: finding github.com/pierrec/lz4 v2.0.5+incompatible go: finding golang.org/x/net v0.0.0-20180906233101-161cd47e91fd go: writing go.mod cache: rename D:\Go\pkg\mod\cache\download\github.com\prometheus\procfs\@v\v0.0.0-20181005140218-185b4288413d.mod373518781.tmp
D:\Go\pkg\mod\cache\download\github.com\prometheus\procfs\@v\v0.0.0-20181005140218-185b4288413d.mod: Access is denied. go: finding github.com/gogo/protobuf v1.1.1 go: finding github.com/fsnotify/fsnotify v1.4.7 go: finding gopkg.in/fsnotify.v1 v1.4.7 go: finding github.com/julienschmidt/httprouter v1.2.0 go: finding github.com/go-logfmt/logfmt v0.3.0 go: finding github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 go: finding google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107 go: finding github.com/pkg/errors v0.8.0 go: finding golang.org/x/tools v0.0.0-20190226205152-f727befe758c go: finding github.com/sirupsen/logrus v1.2.0 go: finding github.com/go-kit/kit v0.8.0 go: finding github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223 go: finding github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf go: finding github.com/onsi/ginkgo v1.6.0 go: finding github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc go: finding gopkg.in/alecthomas/kingpin.v2 v2.2.6 go: finding golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 go: finding github.com/stretchr/objx v0.1.1 go: finding github.com/konsorten/go-windows-terminal-sequences v1.0.1 go: finding golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 go: finding github.com/hpcloud/tail v1.0.0 PS D:\Go\src\apple> go mod download PS D:\Go\src\apple>

 

05、查看软件包的版本信息:

 

 

go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。到今天Go1.14版本推出之后Go modules 功能已经被正式推荐在生产环境下使用了。

目前已经有很多教程讲解如何使用go module,以及如何使用go module导入gitlab私有仓库,我这里就不再啰嗦了。

最近我发现很多小伙伴在群里问如何使用go module导入本地包,毕竟初学者刚开始接触package概念的时候都是先在本地创建一个包,然后尝试本地调用一下,但是在go module模式下调用本地包就很容易被卡住了。

本文就详细介绍下如何使用go module导入本地包。

前提

假设我们现在有moduledemomypackage两个包,其中moduledemo包中会导入mypackage包并使用它的New方法。

mypackage/mypackage.go内容如下:

package mypackage

import "fmt"

func New(){
    fmt.Println("mypackage.New")
}

 

我们现在分两种情况讨论:

在同一个项目下

注意:在一个项目(project)下我们是可以定义多个包(package)的。

目录结构

现在的情况是,我们在moduledemo/main.go中调用了mypackage这个包。

moduledemo
├── go.mod
├── main.go
└── mypackage
    └── mypackage.go

 

导入包

这个时候,我们需要在moduledemo/go.mod中按如下定义:

module moduledemo

go 1.14

 

然后在moduledemo/main.go中按如下方式导入mypackage

package main

import (
    "fmt"
    "moduledemo/mypackage"  // 导入同一项目下的mypackage包
)
func main() {
    mypackage.New()
    fmt.Println("main")
}

 

举个例子

举一反三,假设我们现在有文件目录结构如下:

└── bubble
    ├── dao
    │   └── mysql.go
    ├── go.mod
    └── main.go

 

其中bubble/go.mod内容如下:

module github.com/q1mi/bubble

go 1.14

 

bubble/dao/mysql.go内容如下:

package dao

import "fmt"

func New(){
    fmt.Println("mypackage.New")
}

 

bubble/main.go内容如下:

package main

import (
    "fmt"
    "github.com/q1mi/bubble/dao"
)
func main() {
    dao.New()
    fmt.Println("main")
}

 

不在同一个项目下

目录结构

├── moduledemo
│   ├── go.mod
│   └── main.go
└── mypackage
    ├── go.mod
    └── mypackage.go

 

导入包

这个时候,mypackage也需要进行module初始化,即拥有一个属于自己的go.mod文件,内容如下:

module mypackage

go 1.14

 

然后我们在moduledemo/main.go中按如下方式导入:

import (
    "fmt"
    "mypackage"
)
func main() {
    mypackage.New()
    fmt.Println("main")
}

 

因为这两个包不在同一个项目路径下,你想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在go.mod文件中使用replace指令。

在调用方也就是packagedemo/go.mod中按如下方式指定使用相对路径来寻找mypackage这个包。

module moduledemo

go 1.14


require "mypackage" v0.0.0
replace "mypackage" => "../mypackage"

 

举个例子

最后我们再举个例子巩固下上面的内容。

我们现在有文件目录结构如下:

├── p1
│   ├── go.mod
│   └── main.go
└── p2
    ├── go.mod
    └── p2.go

 

p1/main.go中想要导入p2.go中定义的函数。

p2/go.mod内容如下:

module liwenzhou.com/q1mi/p2

go 1.14

 

p1/main.go中按如下方式导入

import (
    "fmt"
    "liwenzhou.com/q1mi/p2"
)
func main() {
    p2.New()
    fmt.Println("main")
}

 

因为我并没有把liwenzhou.com/q1mi/p2这个包上传到liwenzhou.com这个网站,我们只是想导入本地的包,这个时候就需要用到replace这个指令了。

p1/go.mod内容如下:

module github.com/q1mi/p1

go 1.14


require "liwenzhou.com/q1mi/p2" v0.0.0
replace "liwenzhou.com/q1mi/p2" => "../p2"

 

此时,我们就可以正常编译p1这个项目了。

说再多也没用,自己动手试试吧。

 

 

 

#############################################