go module 安装包的简单使用(goland)

这个装go 的包真是难搞,我特么两三天装个 gin 框架都装不了。c
但是我本地是科学&联网了的。也按照主流的那写方法配置了代理之类的,但就是失败再失败
最后,直接看到一个方法是直接配置 goland 的。我就想,本地命令行都不行,ide 能行?
抱着怀疑的态度,我在 goland 上面配置了一下。出乎医疗,居然可以了
看一下步骤:
配置 goland 的 module 安装模式

goland 配置 module 下载方式

生成 go.mod 文件
注意,我配置后并没有生效,运行当前程序,然后爆了个错:
需要手动创建 go.mod 文件

贴心的 goaland 已经帮我们提示了,点击他就弹出了 go.mod 文件
他会直接在当前根目录穿件一个 空的 go.mod

安装程序文件里出现的 或者 mod require 的包
然后 goland 会直接把我们所需要的 包直接安装到 gopath/pkg/mod 文件夹下了。

可能需要手动同步下包
‘可能安装后,还是识别不了,我们需要下面这样同步一下,安装包

点击 同步

同步成功
左边的 第三方库,也可以大开看到已经安装的包

安装完成后,go.mod 文件里面发现多了 require (xx 包 并且后面还有 版本号,666)

其他发现
这个过程还发现一点,只要你住洞修改 mod 文件,他都会自动把你添加的 包马上下载安装了。真是方便哇。

关于 go module 文档 https://github.com/golang/go/wiki/Modules

learnku : Go Modules 详解使用

简书: 使用Go module导入本地包

go module 模式下,导入本地包就和使用 python import 一样简单

moduledemo和mypackage两个包,其中moduledemo包中会导入mypackage包并使用它的New方法

  • 同一项目(目录)下:
    moduledemo
    ├── go.mod
    ├── main.go
    └── mypackage
    └── mypackage.go
具体文件内容如下:

mypackage/mypackage.go:

package mypackage

moduledemo/go.mod

module moduledemo

moduledemo/main.go:

import (
    "fmt"
    "moduledemo/mypackage"  // 导入同一项目下的mypackage包
)
  • 不在同一个项目下

├── moduledemo
│ ├── go.mod
│ └── main.go
└── mypackage
├── go.mod
└── mypackage.go

mypackage也需要进行module初始化,即拥有一个属于自己的go.mod

文件内容如下:
mypackage/go.mod

module mypackage

moduledemo/main.go

import (
    "fmt"
    "mypackage"
)

两个包不在同一个项目路径下,你想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在go.mod文件中使用replace指令

在调用方也就是packagedemo/go.mod中按如下方式指定使用相对路径来寻找mypackage这个包

module moduledemo

go 1.14

require "mypackage" v0.0.0
replace "mypackage" => "../mypackage"   // 指定包的寻找路径

关于 mod 文件嵌套 mod 的目录结构,好像不建议这样使用 ,没意义的,因我 一个项目用一个 mod 就行了 ,其他子目录可以用 package xxx 就可以了, 引入包 就用 当前 module name/xxx 就行了

下面分享我使用 module 模式 测试的例子:


image.png

当前目录 grpc_demo 进入,执行 go mod init grpc_test
生成 下面的 go.mod 文件:


image.png
  • 新建 main.go

内容如下:

package main
import (
    "grpc_test/XXX"
    "grpc_test/aaa"
)

XXX.Xx()
aaa.A()

新建 aaa 目录,在 aaa 下新建 a.go

package aaa

import "grpc_test/XXX"
func A(){
    XXX.Xx()

}

新建 XXX 目录 , 在 XXX 目录 下新建 xx.go

package XXX

import (
    "grpc_test/aaa"
)

func Xx(){
    aaa.A()
}

ok ,上面的代码已经清楚的说明了, mod 模式下,一个工程项目的导入包的方式,很简答,哈哈哈

注意,上面我只是为了说明,导入包的方式, 出现了循环导入的情况,但这属于语法错误,导入包 ide 都是显示可以找到这个包的

Xx() 和 A() 循环导入了,是不对的哦

2020 goland版本 配置 goproxy 参考:
https://bobsong.cn/1230.html

常见的问题:


mod 顶层文件夹下,单个文件应该属于 mod init 后面的模块名字 或者 main, 如果要使用其他名字,那就 需要建文件夹了, 如图上的提示

mod 顶级目录下, 单文件 的package 声明 应该 是 mod module 的名字 或者 main 或者 新建目录,把文件放在里面 使用其他的 package 名字

这就有了那个问题就是: 同一个文件夹下的单文件应该属于同一个包, 她下面的子目录 包名字 可以是其他,但也同样递归的遵守这个 包名的规则。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。