golanggf库,goggg
更新:<time datetime="2022-11-28 16:43">2022-11-28 16:43</time>
本文目录一览:
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!----------------------------")
}