本文目錄一覽:
- 1、golang私有倉庫依賴配置
- 2、知識分享之Golang——精選的組件庫、組件列表,各種golang組件都可找到
- 3、如何在golang 中調用c的靜態庫或者動態庫
- 4、golang多進程庫pagent
golang私有倉庫依賴配置
golang私有倉庫依賴配置
版本要求:go 1.14+
go mod 配置:
go env -w GOPRIVATE=”gitlab.xxx.com” //配置私有倉庫域名 :重要
go env -w GONOPROXY=”gitlab.xxx.com” //此配置下的域名默認不走代理
go env -w GONOSUMDB=”gitlab.xxx.com” //此配置下的域名默認不進行gosumdb校驗
go env -w GOINSECURE=”gitlab.xxx.com” //此配置下的域名默認採用http協議 。有些公司的私有倉庫採用http協議,而go mod默認採用 https,請根據實際情況進行配置:重要
賬戶及密碼:
因私有倉庫一般都需要進行登錄,所以可以通過隱藏文件進行用戶名及密碼配置。
文件路徑:~/.netrc //默認Linux系統,
文件內容:
machine 域名 //gitlab.xxx.com
login 賬號
password 密碼
知識分享之Golang——精選的組件庫、組件列表,各種golang組件都可找到
知識分享之Golang篇是我在日常使用Golang時學習到的各種各樣的知識的記錄,將其整理出來以文章的形式分享給大家,來進行共同學習。歡迎大家進行持續關注。
知識分享系列目前包含Java、Golang、Linux、Docker等等。
awesome-go 這個組件包含了各種golang中常用的組件,說白了就是一個精選的 Go 框架、庫和軟件的匯總表。
我們日常需要尋找各種golang組件時在這個列表中基本都可以快速找到。
如何在golang 中調用c的靜態庫或者動態庫
Cgo 使得Go程序能夠調用C代碼. cgo讀入一個用特別的格式寫的Go語言源文件, 輸出Go和C程序, 使得C程序能打包到Go語言的程序包中.
舉例說明一下. 下面是一個Go語言包, 包含了兩個函數 — Random 和 Seed — 是C語言庫中random和srandom函數的馬甲.
package rand
/*
#include stdlib.h
*/ import “C” func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) }
我們來看一下這裡都有什麼內容. 開始是一個包的導入語句.
rand包導入了”C”包, 但你會發現在Go的標準庫里沒有這個包. 那是因為C是一個”偽包”, 一個為cgo引入的特殊的包名, 它是C命名空間的一個引用.
rand 包包含4個到C包的引用: 調用 C.random和C.srandom, 類型轉換 C.uint(i)還有引用語句.
Random函數調用libc中的random函數, 然後回返結果. 在C中, random返回一個C類型的長整形值, cgo把它輪換為C.long. 這個值必需轉換成Go的類型, 才能在Go程序中使用. 使用一個常見的Go類型轉換:
func Random() int { return int(C.random()) }
這是一個等價的函數, 使用了一個臨時變量來進行類型轉換:
func Random() int { var r C.long = C.random() return int(r) }
Seed函數則相反. 它接受一個Go語言的int類型, 轉換成C語言的unsigned int類型, 然後傳遞給C的srandom函數.
func Seed(i int) { C.srandom(C.uint(i)) }
需要注意的是, cgo中的unsigned int類型寫為C.uint; cgo的文檔中有完整的類型列表.
這個例子中還有一個細節我們沒有說到, 那就是導入語句上面的注釋.
/*
#include stdlib.h
*/ import “C”
Cgo可以識別這個注釋, 並在編譯C語言程序的時候將它當作一個頭文件來處理. 在這個例子中, 它只是一個include語句, 然而其實它可以是使用有效的C語言代碼. 這個注釋必需緊靠在import “C”這個語句的上面, 不能有空行, 就像是文檔注釋一樣.
Strings and things
與Go語言不同, C語言中沒有顯式的字符串類型. 字符串在C語言中是一個以0結尾的字符數組.
Go和C語言中的字符串轉換是通過C.CString, C.GoString,和C.GoStringN這些函數進行的. 這些轉換將得到字符串類型的一個副本.
下一個例子是實現一個Print函數, 它使用C標準庫中的fputs函數把一個字符串寫到標準輸出上:
package print // #include stdio.h // #include stdlib.h import “C” import “unsafe” func Print(s string) { cs := C.CString(s) C.fputs(cs, (*C.FILE)(C.stdout)) C.free(unsafe.Pointer(cs)) }
在C程序中進行的內存分配是不能被Go語言的內存管理器感知的. 當你使用C.CString創建一個C字符串時(或者其它類型的C語言內存分配), 你必需記得在使用完後用C.free來釋放它.
調用C.CString將返回一個指向字符數組開始處的指錯, 所以在函數退出前我們把它轉換成一個unsafe.Pointer(Go中與C的void 等價的東西), 使用C.free來釋放分配的內存. 一個慣用法是在分配內存後緊跟一個defer(特別是當這段代碼比較複雜的時候), 這樣我們就有了下面這個Print函數:
func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) }
構建 cgo 包
如果你使用goinstall, 構建cgo包就比較容易了, 只要調用像平常一樣使用goinstall命令, 它就能自動識別這個特殊的import “C”, 然後自動使用cgo來編譯這些文件.
如果你想使用Go的Makefiles來構建, 那在CGOFILES變量中列出那些要用cgo處理的文件, 就像GOFILES變量包含一般的Go源文件一樣.
rand包的Makefile可以寫成下面這樣:
include $(GOROOT)/src/Make.inc
TARG=goblog/rand
CGOFILES=\ rand.go\ include $(GOROOT)/src/Make.pkg
然後輸入gomake開始構建.
更多 cgo 的資源
cgo的文檔中包含了關於C偽包的更多詳細的說明, 以及構建過程. Go代碼樹中的cgo的例子給出了更多更高級的用法.
一個簡單而又符合Go慣用法的基於cgo的包是Russ Cox寫的gosqlite. 而Go語言的網站上也列出了更多的的cgo包.
最後, 如果你對於cgo的內部是怎麼運作這個事情感到好奇的話, 去看看運行時包的cgocall.c文件的注釋吧.
golang多進程庫pagent
地址:
pagent是一個多進程模型的golang庫,具有以下特點:
簡單: 父子進程只通過stdin和stdout來交互
安全: 多進程很安全,子進程掛掉一個不影響其他子進程
解耦:子進程交互和業務分離
例子:
package main
import (
“fmt”
“time”
“github.com/adwpc/pagent”
)
type MyBiz struct {
pagent.Master
}
func NewBiz() *MyBiz {
return MyBiz{}
}
func (a *MyBiz) BizRunning(id, str string) error {
fmt.Println(“[MyBiz BizRunning] str=” + str)
return nil
}
func (a *MyBiz) BizFinish(id string, err error) error {
fmt.Println(“[MyBiz BizFinish] id=” + id)
return err
}
func main() {
a := NewBiz()
fmt.Println(“worker1————————-“)
a.GetWorker(“worker1”).Start(“bash”, a.BizRunning, a.BizFinish)
a.GetWorker(“worker1”).Input(“ls”)
time.Sleep(1 * time.Second)
a.DelWorker(“worker1”)
fmt.Println(“worker2————————-“)
a.GetWorker(“worker2”).Start(“ifconfig”, nil, a.BizFinish)
time.Sleep(1 * time.Second)
a.DelWorker(“worker2”)
fmt.Printf(“end!—————————-“)
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/230464.html
微信掃一掃
支付寶掃一掃