go使用第三方包和本地包_小小郭-程序员宅基地_go引入第三方包
前言
go之前對第三方包的管理不上心,其他語言比如python有pip,nodejs有npm,而go卻沒有一個官方的管理工具。
在go 1.11之前,開發(fā)者需要要關(guān)注GOPATH環(huán)境變量,這對于開發(fā)者來說不友好。
經(jīng)過幾次變更后,go于1.12版本開始正式使用go Module,go終于有了一個官方的處理方式,開發(fā)者也可以拋棄GOPATH了。
本次使用的go版本為1.15.6,建議使用1.13或以上的版本,舊的方式就不要再關(guān)注了,讓它隨風(fēng)而去吧。
go version go1.15.6 darwin/amd64
本次使用的系統(tǒng)為Ubuntu,實(shí)驗(yàn)路徑/opt/golang
root@xxg:/opt/golang# pwd
/opt/golang
第三方包
假設(shè)我們有個項(xiàng)目叫caseshow,我們先創(chuàng)建這個目錄,并初始化一下
mkdir caseshow
cd caseshow
go mod init caseshow
此時在caseshow目錄下會自動產(chǎn)生一個go.mod文件,內(nèi)容如下:
module caseshow
go 1.15
比如我們想使用一個redis客戶端:github.com/go-redis/redis/v8,在當(dāng)前路徑下直接執(zhí)行g(shù)o get命令即可:
go get github.com/go-redis/redis/v8
最近訪問github很慢,可以先設(shè)置一下代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
設(shè)置好之后,下載第三方庫
root@xxg:/opt/golang/caseshow# go get github.com/go-redis/redis/v8
go: downloading github.com/go-redis/redis v6.15.9+incompatible
go: downloading github.com/go-redis/redis/v8 v8.4.2
go: github.com/go-redis/redis/v8 upgrade => v8.4.2
go: downloading go.opentelemetry.io/otel v0.14.0
go: downloading github.com/cespare/xxhash/v2 v2.1.1
go: downloading github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f
目錄下會多一個go.sum文件,go.mod文件里面也多了關(guān)于redis庫的內(nèi)容
root@xxg:/opt/golang/caseshow# ls
go.mod go.sum
root@xxg:/opt/golang/caseshow# cat go.mod
module caseshow
go 1.15
require github.com/go-redis/redis/v8 v8.4.2 // indirect
之后就可以直接用了,寫個redis.go測試下:
package main
import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
)
var ctx = context.Background()
func ExampleClient() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
err := rdb.Set(ctx, "key", "value", 0).Err()
if err != nil {
panic(err)
}
val, err := rdb.Get(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println("key", val)
val2, err := rdb.Get(ctx, "key2").Result()
if err == redis.Nil {
fmt.Println("key2 does not exist")
} else if err != nil {
panic(err)
} else {
fmt.Println("key2", val2)
}
// Output: key value
// key2 does not exist
}
func main() {
ExampleClient()
}
測試正常:
root@xxg:/opt/golang/caseshow# go run redis.go
key value
key2 does not exist
整個過程沒有GOPATH什么事。
本地包
在項(xiàng)目開發(fā)中會復(fù)用本地的一些代碼,這就涉及到了本地包的引入。
情況0 同路徑引用其他文件
無需import,直接使用對應(yīng)的方法。go build時,在后面加上要用的文件名即可,比如
go build main.go main_command.go
go run調(diào)試時,在后面加上要用的文件名即可,比如
go run main.go main_command.go
情況1 同目錄下
在同路徑下不能存在多個package名,如果要定義其他的package,可以創(chuàng)建一個對應(yīng)名字的目錄,把代碼放下面,之后再引用。
假設(shè)在caseshow中有個本地開發(fā)的包mymodule,里面有個方法Pprint,結(jié)構(gòu)如下
# tree
.
├── go.mod
├── go.sum
├── mymodule
│ └── pprint.go
└── redis.go
1 directory, 4 files
pprint.go的代碼如下:
package mymodule
import "fmt"
func Pprint(a string){
fmt.Println("pprint ", a)
}
如果caseshow目錄下的其他地方要用這個方法,則使用caseshow + package名稱導(dǎo)入即可。
比如main.go:
package main
import "caseshow/mymodule"
func main(){
mymodule.Pprint("jack")
}
直接運(yùn)行:
# go run main.go
pprint jack
情況2 不同目錄下
假設(shè)有另一個項(xiàng)目caselive,與caseshow同級,該目錄下有個包yourmodule,里面有個方法Yprint:
# tree
.
├── caselive
│ ├── go.mod
│ ├── main.go
│ └── yourmodule
│ └── yprint.go
└── caseshow
├── go.mod
├── go.sum
├── main.go
├── mymodule
│ └── pprint.go
└── redis.go
4 directories, 8 files
yprint.go的內(nèi)容如下:
package yourmodule
import "fmt"
func Yprint(a string){
fmt.Println("yprint ", a)
}
此時在caseshow中要調(diào)用caselive中yourmodule的Yprint方法,可以用replace參數(shù)來實(shí)現(xiàn)。
在caseshow的go.mod中增加caselive的引入:
require mypackage v0.0.0
replace mypackage => ../mypackage
完整內(nèi)容如下:
module caseshow
go 1.15
require github.com/go-redis/redis/v8 v8.4.2 // indirect
require caselive v0.0.0
replace caselive => ../caselive
之后就能直接調(diào)用了:
package main
import "caseshow/mymodule"
import "caselive/yourmodule"
func main(){
mymodule.Pprint("jack")
yourmodule.Yprint("jack")
}
運(yùn)行測試下:
# go run main.go
pprint jack
yprint jack
總結(jié)
以上是生活随笔為你收集整理的go使用第三方包和本地包_小小郭-程序员宅基地_go引入第三方包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html 中的frameset标签
- 下一篇: 谷歌为 Pixel Watch 智能手表