zoukankan      html  css  js  c++  java
  • 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 mod init war

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

    参考:

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

  • 相关阅读:
    新一代MQ apache pulsar的架构与核心概念
    Flutter使用fluwx实现微信分享
    BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
    NOIP2016提高组Day1T2 天天爱跑步 树链剖分 LCA 倍增 差分
    Codeforces 555C Case of Chocolate 其他
    NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
    NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
    NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
    Codeforces 873F Forbidden Indices 字符串 SAM/(SA+单调栈)
    Codeforces 873E Awards For Contestants ST表
  • 原文地址:https://www.cnblogs.com/xingchong/p/15788922.html
Copyright © 2011-2022 走看看