日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

go使用第三方包和本地包_小小郭-程序员宅基地_go引入第三方包

發(fā)布時間:2023/12/15 综合教程 42 生活家
生活随笔 收集整理的這篇文章主要介紹了 go使用第三方包和本地包_小小郭-程序员宅基地_go引入第三方包 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。