go modules

目录


    在一个空文件夹下,初始化一个 Module

    $ go mod init example
    go: creating new go.mod: module example
    

    此时,在当前文件夹下生成了go.mod,这个文件记录当前模块的模块名以及所有依赖包的版本。

    接着,我们在当前目录下新建文件 main.go,添加如下代码:

    package main
    
    import (
    	"fmt"
    
    	"rsc.io/quote"
    )
    
    func main() {
    	fmt.Println(quote.Hello())  // 你好,世界。
    }
    

    运行 go run . ,输出如下

    main.go:6:2: no required module provides package rsc.io/quote; to add it:
            go get rsc.io/quote
    

    手动执行第三方包 rsc.io/quote的下载

    $ go get rsc.io/quote
    go: added golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
    go: added rsc.io/quote v1.5.2
    go: added rsc.io/sampler v1.3.0
    

    具体的版本信息也记录在了go.mod中

    module example
    
    go 1.22.2
    
    require rsc.io/quote v1.5.2
    
    require (
    	golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
    	rsc.io/sampler v1.3.0 // indirect
    )
    

    在 go.mod 的第5行是直接依赖,后面的 // indirect 是间接依赖

    可以通过go list -m all列出当前模块和所有依赖

    $ go list -m all
    example
    golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
    rsc.io/quote v1.5.2
    rsc.io/sampler v1.3.0
    

    第一行是当前模块,也称为主模块。后面的是依赖,依赖包含名称和版本号,第一个依赖是伪版本号,后面的是正常的语义版本标签。

    go.sum 中包含了模块的哈希值

    golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
    golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
    rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
    rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
    rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
    rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
    

    我们在当前目录,添加一个子 package calc,代码目录如下:

    demo/
       |--calc/
          |--calc.go
       |--main.go
    

    在 calc.go 中写入

    package calc
    
    func Add(num1 int, num2 int) int {
    	return num1 + num2
    }
    

    在 package main 中如何使用 package cal 中的 Add 函数呢?

    import 模块名/子目录名即可,修改后的 main 函数如下:

    package main
    
    import (
    	"fmt"
    	"example/calc"
    
    	"rsc.io/quote"
    )
    
    func main() {
    	fmt.Println(quote.Hello())
    	fmt.Println(calc.Add(10, 3))
    }
    
    $ go run .
    你好,世界。
    13
    
    posted @   guanyubo  阅读(10)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · 全程不用写代码,我用AI程序员写了一个飞机大战
    · DeepSeek 开源周回顾「GitHub 热点速览」
    · 记一次.NET内存居高不下排查解决与启示
    · MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
    · .NET10 - 预览版1新功能体验(一)
    点击右上角即可分享
    微信分享提示