Go——使用 go mod ——有依赖的Go工程

一、依赖于github.com/kataras/iris/v12,写一个http服务, 返回Hello World

test.go

package main
import (
    iris "github.com/kataras/iris/v12"
)
func main() {
    app := iris.New()
    app.Get("/", func(ctx iris.Context) {
        ctx.HTML("<h1>Hello World!</h1>")
    })
    app.Run(iris.Addr(":8080"))
}

代码中使用了 iris

1、可手动下载  go get github.com/kataras/iris/v12

2、使用 mod 管理依赖

初始化mod, war为模块名,可自定义

        go mod init i.com/war

go.mod:

module i.com/war
go 1.17
require github.com/kataras/iris/v12 v12.1.8

运行test.go,     

go run test.go

依赖包会自动下载到 GOPATH/pkg/mod 目录下

运行成功,访问  http://localhost:8080/

 

二、关于go.mod

如果你的包引入的外部包不够好,你想重构怎么办?这个时候就靠replace命令出手了

go.mod:

module github.com/shgopher/short
replace(
    github.com/shgoper/i v0.1.0 => github.com/shgopher/newShort v0.3.0
)

 

三、如何依赖本地包

1、新建本地包 ../model/mymodel.go 

package model
func Say() string {
    return "hi..."
}

package关键字后的名字,model可理解为类名,因为之后调用它的方法是通过  model.Say() 来调用,

当然,也可在使用方用  import  modelhh "i.com/model" 来定义别名,这样就可用modelhh.Say() 来调用。

另外,注意方法名首字母大写。

 

进入model目录执行 go mod init i.com/model

生成go.mod文件

module i.com/model
go 1.17

初始化go.mod时,须指定模块名(域名/路径/名字),否则会报错 outside GOPATH, module path must be specified

这里的模块名一般为 域名/路径/名字, 最后的名字就用包名字,

当然不强制,非要定义为 themodel,既无域名也不与包名字一致,也不会报错。

但是若代码是github托管的,那模块名必然就是 github.com/xxinc/model 的形式,因为只有这样才能被mod管理。

 

2、新建本地main包 ../demo/mydemo.go

package main
import (
    "fmt"
    "i.com/model"
)
func main(){
    fmt.Println("demo main, say:")
    fmt.Println(model.Say())
}

这里的 import  "i.com/model" ,要与自身go.mod中的模块名一样,

若代码是github托管的,那模块名就是 github.com/xxinc/model 的形式

 

进入demo目录执行 go mod init i.com/demo

生成go.mod文件

module demo/demo
go 1.17
require i.com/model v0.0.0
replace i.com/model => ../model 

由于i.com/model地址下并没有model的代码,需要用replace来替换成本地地址,

接下就可以在mydemo.go里调用model.Say()方法。

另,replace后面的两个地址,都用远程地址时,作用就是替换远程包地址,而不用修改源码中的import。

 

3、执行 go run mydemo.go 

bogon:demo chong$ go run mydemo.go 
demo main, say:
hi...
bogon:demo chong$ 

 

四、命令备份

go env
GOPROXY="https://proxy.golang.org,direct"

 

设置国内代理

go env -w GOPROXY=https://goproxy.io,direct

go env -w GOPROXY=https://goproxy.io,direct

 

go mod init war

#添加需要用到但go.mod中查不到的模块
#删除未使用的模块
go mod tidy

 

参考:

https://blog.csdn.net/qq_38151401/article/details/105780251

posted @ 2022-01-11 16:29  会飞的斧头  阅读(443)  评论(0编辑  收藏  举报