golang相关,包括go mod 使用第三方包和自己本地开发的包

一.  环境配置

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

二.  go mod 使用

    在系统任意目录下建立gomodtest目录,而不需要把gomodtest放到GOPATH目录下。

    1. cmd 到当前gomodtest目录下,运行 go mod init gomodtest

    2. 建立main文件,内容如下:

package main

import(
    "fmt"
    "sum"
    "github.com/jinzhu/configor"
)

func main() {
	fmt.Println("hello world")
	fmt.Println("sum=",sum.Sum(2, 5))
	fmt.Println("使用外部包测试:", configor.Config{})
}

 3. 建立目录sum,cmd进到sum目录下运行 go mod init sum,在sum下新建sum.go文件,内容如下:

package sum

func Sum(a int, b int) int {
    return a + b
}

4. cmd进到gomodtest目录下,运行go run main.go。

   报错提示:

main.go:6:5: no required module provides p
add it:
        go get github.com/jinzhu/configor

我们运行 go get github.com/jinzhu/configor

然后再运行go run main.go

报错提示:

main.go:5:5: package sum is not in GOROOT (D:\Program Files\Go\src\sum)

提示找不到sum包。打开go.mod文件,添加新内容。

旧文件:

module gomodtest

go 1.16

require (
	github.com/jinzhu/configor v1.2.1
)

新文件:

module gomodtest

go 1.16

require (
	github.com/jinzhu/configor v1.2.1
	sum v0.0.0
)

replace sum => ./sum

再次运行go run main.go

输出结果如下:

hello world
sum= 7
使用外部包测试: {  false false false false 0s  false}

有时候会有一些奇怪的报错,运行一下命令 go mod tidy

当然,要想使用sum目录下的包,最简单的方式还是直接import!!引用方式跟使用GOPATH是一样。既gomodtest /sum。文件如下:

module gomodtest

go 1.16

require (
	github.com/jinzhu/configor v1.2.1
)

而此时sum目录下不需要有go.mod文件,有go.mod文件也不影响

而main.go文件内容如下:

package main

import(
    "fmt"
    // "sum" 之前的引用方式,这种情况要使用replace
    "gomodtest/sum"
    "github.com/jinzhu/configor"
)

func main() {
	fmt.Println("hello world")
	fmt.Println("sum=",sum.Sum(2, 5))
	fmt.Println("使用外部包测试:", configor.Config{})
}

运行go run main.go 即可

目录结构:

版本:go 1.15.10

gomodtest文件夹
    sum文件夹
        sum.go
    sum2文件夹
        sum2.go
    main.go

    当go build时会自动下载相关依赖包然后编译,main.go中有对sum包的引用,或者sum2包中有对sum包的引用同时main包引用sum2包,以上两种情况都没有任何问题。
    而对于当前最新的go版本(1.16.3),go build时,相关依赖包需要手动下载,并且,上述类似的包引用方式,将找不到相应的包!!!

注:以上方法,sum目录必须在当前gomodtest目录下,如果sum目录不在gomodtest目录下,比如同级或者更高等,则需要用require 和 replace,同时sum目录下需要有go.mod文件

5. 比如如下情况,来自于这里

目录结构
├── moduledemo
│   ├── go.mod
│   └── main.go
└── mypackage
    ├── go.mod
    └── mypackage.go
导入包
这个时候,mypackage也需要进行module初始化,即拥有一个属于自己的go.mod文件,内容如下:

module mypackage

go 1.14
然后我们在moduledemo/main.go中按如下方式导入:

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

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

module moduledemo

go 1.14


require "mypackage" v0.0.0
replace "mypackage" => "../mypackage"

6. 对于一个包,如果它的github地址为:github.com/topfreegames/pitaya,初始化的时候我们可以这样操作:go mod init github.com/topfreegames/pitaya

则go.mod文件如下:

那么在程序中使用pitaya中的某个包时可以直接如图所示这样使用:

golang相关,包括go mod 使用第三方包和自己本地开发的包_第1张图片

当我点击component时,它直接跳到了当前目录下的component的目录下!!!

golang相关,包括go mod 使用第三方包和自己本地开发的包_第2张图片

而对于引用的其它网络包,当我点击它时,它会跳到$GOPATH/pkg/mod目录下的相应包目录里面!!!

golang相关,包括go mod 使用第三方包和自己本地开发的包_第3张图片

golang相关,包括go mod 使用第三方包和自己本地开发的包_第4张图片golang相关,包括go mod 使用第三方包和自己本地开发的包_第5张图片

7.  而对于另外一种情况,希望把pitaya作为一整个包使用,则可以这样:

go.mod文件内容如下:

golang相关,包括go mod 使用第三方包和自己本地开发的包_第6张图片

目录结构如下:

golang相关,包括go mod 使用第三方包和自己本地开发的包_第7张图片

echo_server.go 内容如下:

golang相关,包括go mod 使用第三方包和自己本地开发的包_第8张图片

可以看到,我们可以直接使用pitaya里的各个包

三. go mod 在goland中的调试

goland下采用go mod 的方式,怎么配置goland使用go mod 的方式可以网上搜索!

配置后调试go程序,发现断点全是灰色的!!!鼠标移到灰色的断点上会提示:Only part of a ReadProcessMemory or WriteProcessMemory request was completed。解决办法:

1、升级goland到最新版本:goland与golang的版本不匹配,导致goland安装包的dlv.exe程序在调试go mod模式时的go程序存在兼容问题。

2、单独升级goland目录下的dlv.exe程序:

    a. 可以下载较新的dlv.exe程序覆盖本地的dlv.exe:我已经上传了,可以到我的资源里面去下载。golang调试程序dlv.exe(delve)_delve-其它文档类资源-CSDN下载

    b. 也可以自己编译最新的dlv程序生成dlv.exe:在cmd命令行(任意目录即可)运行 go get -u github.com/go-delve/delve/cmd/dlv,成功后在GOPATH/bin目录下会生成dlv.exe,覆盖掉goland目录下的dlv.exe,然后重启goland即可。

golang相关,包括go mod 使用第三方包和自己本地开发的包_第9张图片

覆盖后

golang相关,包括go mod 使用第三方包和自己本地开发的包_第10张图片

需要注意的是go的版本与dlv的版本要匹配才行,不然debug时会出问题,比如当goland勾选时,直接运行调试按钮

会提示错误(go是1.15.10, dlv是1.8.1,所以版本不匹配): 

 这时候要么升级go版本,要么降低dlv版本即可。

四.  使用goland的 附加到进程时(Attach to Process)发现是空的,没有任何可以附加的进程,这时候可以查看goland右下方,一般会提示你go get ***,安装提示下载完成后即可使用了!!!

五.  golang工具:gofmt、golangci-lint

olangci-lint在goland中的配置:

go get -u GitHub - golangci/golangci-lint: Fast linters Runner for Go

然后会在GOPATH目录中生成 golangci-lint.exe

官网的说明文件如下:

golangci-lint 官网安装教程

golang相关,包括go mod 使用第三方包和自己本地开发的包_第11张图片

goland配置如下:

golang相关,包括go mod 使用第三方包和自己本地开发的包_第12张图片

golang相关,包括go mod 使用第三方包和自己本地开发的包_第13张图片

 这样配置后当文件有改变且保存时就会自动执行 golangci-lint 了!

注意:

1. go 版本与 golangci-lint 版本对应如下:

go < 1.9 isn't supported
go1.9 is officially supported by golangci-lint <= v1.10.2
go1.10 is officially supported by golangci-lint <= 1.15.0.
go1.11 is officially supported by golangci-lint <= 1.17.1.
go1.12+ are officially supported by the latest version of golangci-lint (>= 1.18.0).

2. golangci-lint的安装也可以使用如下方式。

golang相关,包括go mod 使用第三方包和自己本地开发的包_第14张图片

这种方式下载的golangci-lint在目录

你可能感兴趣的:(GOLANG,golang,开发语言,后端)