golanggf库,goggg

发布时间:2023-12-08

golanggf库,goggg

更新:<time datetime="2022-11-28 16:43">2022-11-28 16:43</time>

本文目录一览:

  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.CStringC.GoStringC.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!----------------------------")
}