基本使用 有时候我们需要使用golang去调用一些c的类库,因为使用golang重复实现一遍比较耗时,一些成熟的功能直接调用更好。当然前提是要先安装该c库。CGO可以直接用C的代码,或者C的静态库,或者动态库,当然C++也是可以的。 golang中的CGO特性,能够创建调用C代码的Go包。 package main import "C" func main() { }
(一)启用CGO特性 在golang代码中加入import “C”语句就可以启动CGO特性。这样在进行go build命令时,就会在编译和连接阶段启动 gcc 编译器。 // go.1.15 // test1.go package main import "C" // import "C" 更像是一个关键字,CGO工具在预处理时会删掉这一行 func main() { } 使用 -x
https://golang.org/misc/cgo/test/callback.go // Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE
CGO即C语言调用Golang语言的接口,是Golang语言中调用C或C++语言库的方案之一。然而在使用CGO时,一些设置及调用方式需要特别注意,以便使CGO代码更加优雅高效。CGO_CFLAGS和CGO_LDFLAGS的设置CGO_CFLAGS和CGO_LDFLAGS参数用于定义C语言编译器和链接器的选项,CGO_CFLAGS定义了C语言编译器的选项,CGO_LDFLAGS定义了链接器的选项
golang条件编译可以类比c的#ifndef #define #enif等宏,作用是类似的。golang条件编译可以用宏(//+build,//go:build。两种写法作用一样,后者适用一些老版本),也可以通过文件名后缀,比如nsenter_linux.go,一个示例。//go:build linux && !gccgo// +build linux,!gccgopackage 原创
最简略的CGO程序 //cgo.go package main import "C" func main(){ println("hello cgo") } 上述代码是一个残缺的CGO程序,通过import “C”语句启动了CGO个性,go build命令会在编译和链接阶段启动gcc编译器 源码形式调用C函数 cgoTest.h void SayHello(const char* s);
popDataInterface{} 错误解法 var popJsonStr string = popData.(string) fmt.Println(popJsonStr) var taskData map[string]string err = json.Unmarshal([]byte(popJsonStr), &taskData) fmt
heap包提供了对任意类型(实现了heap.Interface接口)的堆操作。(最小)堆是具有“每个节点都是以其为根的子树中最小值”属性的树。 树的最小元素为其根元素,索引0的位置。 heap是常用的实现优先队列的方法。要创建一个优先队列,实现一个具有使用(负的)优先级作为比较的依据的Less方法的Heap接口,如此一来可用Push添加项目而用Pop取出队列最高优先级的项目。 type
什么是heap Heap 是一种数据结构,其中包含一个特殊的根节点,且每个节点的值都不小于(或不大于)其所有子节点的值。这种数据结构常用于实现优先队列。 Heap的数据结构 Heap 可以通过一个数组来实现,这个数组满足以下条件: 和二叉搜索树不同,堆并不需要满足左子节点小于父节点的值,右子节点大于父节点的值的条件。堆中的一些列节点按照某种特定的顺序排列。这样的顺序可以是最小的元素在最前面
单向队列只允许一端进一端出双端队列两端都进和出 基于切片的单向队列简单实现 package main import ( "fmt" "sync" ) type QueueInterface interface { Len() int Empty() bool Clear() Push(data interface{}) Pop() interface{} Peep()