GO mod入门

借鉴帖子,特别感谢:

作者:会飞的鲶鱼
链接: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有一下三种类型。

  • on 所有的构建,都使用Module机制
  • off 所有的构建,都不使用Module机制,而是使用GOPATH和Vendor
  • auto 在GOPATH下的工程,不使用Module机制,不在GOPATH下的工程使用

GO mod入门_第1张图片

 

接下来,我们新建个项目(不需要在gopath下哈),

GO mod入门_第2张图片

然后依次创建下面的目录

如果在idea的module爆红或者有错误,勾选下下面的配置

GO mod入门_第3张图片

然后我们创建两个文件夹,最终项目结构如下:

GO mod入门_第4张图片

然后我们就打开命令行依次在项目根目录、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

 

项目整体结构如下:

GO mod入门_第5张图片

下面是代码

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 mod入门_第6张图片GO mod入门_第7张图片

这个go.num的作用是存储对应的module-版本以及hash值,这样我们就算简单的完成了,启动之后访问

127.0.0.1:8080

GO mod入门_第8张图片

如果,我们想在mrfox.service中使用mrfox.api的方法怎么做呢这时就涉及到跨module引用的问题?

我们可以直接在mod文件中添加依赖,并将其指向本地相对路径(注意,这里的的路径是以mod文件作为起点,并且我们只需要加入module名就行,不需要加入module下的路径)

GO mod入门_第9张图片

然后修改代码即可:

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()
}

之后运行,成功

GO mod入门_第10张图片

最后代码详见我的资源,能给个硬币就给个硬币,毕竟走了无数的坑。。。没有硬币,私信我也行(其实代码都在这篇文章里)

你可能感兴趣的:(菜鸟成长之路,go学习之路,go,golang)