借鉴帖子,特别感谢:
作者:会飞的鲶鱼
链接:https://www.jianshu.com/p/c666ebdb462b
Go Module是Go官方在1.11以上版本依赖管理,是go的亲儿子,我们来学习一波,用它首先可以抛弃在gopath下编写代码的尴尬局面(是的,为什么一定要在gopath下,项目不是应该有专门的存放地吗?不符合逻辑的做法)
首先设置包代理和GO111MODULE
go env -w GOPROXY=https://goproxy.io,direct
go env -w GO111MODULE=on
GO111MODULE有一下三种类型。
接下来,我们新建个项目(不需要在gopath下哈),
然后依次创建下面的目录
如果在idea的module爆红或者有错误,勾选下下面的配置
然后我们创建两个文件夹,最终项目结构如下:
然后我们就打开命令行依次在项目根目录、mrfox.api、mrfox.service下输入如下
命令:
mrfox.api
go mod init mrfox.api
mrfox.service
go mod init mrfox.service
mrfox.go-test
go mod init mrfox.go-test
成功生成三个modules,根modules是mrfox.go-test
项目整体结构如下:
下面是代码
main.go
package main
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
)
func main() {
server := g.Server()
server.BindHandler("/", func(r *ghttp.Request) {
r.Response.Write("Hello World")
})
server.SetPort(8080)
server.Run()
}
pkg.go
package entity
import "fmt"
func Hello(person Person) {
fmt.Println(Person.GetAgeInterval(person))
}
Person.go
package entity
type Person struct {
Age int
Name string
}
const (
//0-3
infant string = "婴幼儿"
//4-10
childhood string = "童年"
//11-15
child string = "少年"
//16-30
young string = "青年"
//31-50
middle string = "中年"
//50以后
old string = "老年"
)
//首字母大写代表public
func (p Person) GetAgeInterval() string {
switch {
case p.Age > 0 && p.Age <= 3:
return infant
case p.Age >= 4 && p.Age <= 10:
return childhood
case p.Age >= 11 && p.Age <= 15:
return child
case p.Age >= 16 && p.Age <= 30:
return young
case p.Age >= 31 && p.Age <= 50:
return child
case p.Age >= 51:
return old
default:
return "未知"
}
}
然后我们在mrfox.service项目的根目录执行
go mod tidy
这个时候mod就会删除无用的依赖,并且下载项目内缺的依赖
或者使用
go mod download
或者是直接
go build main.go
,这个也会下载
具体下载的目录在哪里呢,他是在${GOPATH}/pkg/mod下,完成后mrfox.service里的go.mod会发生变化,并且产生一个go.sum
这个go.num的作用是存储对应的module-版本以及hash值,这样我们就算简单的完成了,启动之后访问
127.0.0.1:8080
如果,我们想在mrfox.service中使用mrfox.api的方法怎么做呢这时就涉及到跨module引用的问题?
我们可以直接在mod文件中添加依赖,并将其指向本地相对路径(注意,这里的的路径是以mod文件作为起点,并且我们只需要加入module名就行,不需要加入module下的路径)
然后修改代码即可:
import (
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"mrfox.api/entity"
)
func main() {
person := entity.Person{20, "20"}
entity.Hello(person)
server := g.Server()
server.BindHandler("/", func(r *ghttp.Request) {
r.Response.Write("Hello World")
})
server.SetPort(8080)
server.Run()
}
之后运行,成功
最后代码详见我的资源,能给个硬币就给个硬币,毕竟走了无数的坑。。。没有硬币,私信我也行(其实代码都在这篇文章里)