我几天前就开始研究Go了,它来自CGO的东西和gccgo编译器.根据我的理解,这允许使用Go编译器编译Go程序并使用C编译器编译C库并从Go程序内引用这些库.这对我来说非常有趣,因为这使我们可以从主程序中利用C的性能(如果需要),而且开销很小.
但是我不确定那是多么的少,所以我在这里问:
是否有创建C库的情况只是为了在Go应用程序中使用它?或者此功能仅用于促进现有C代码的重用性?
PS:我认为目前CGO不支持C++,但是有人发表了一篇能够使用C函数包装C++代码并成功调用它们的帖子.
我正在尝试与 Go 中的一些 C 代码交互。使用 cgo,这一直相对简单,直到我遇到这种(相当常见的)情况:需要将指针传递给本身包含指向某些数据的指针的结构。如果不诉诸于将结构的创建放入 C 代码本身,我似乎无法弄清楚如何从 Go 中做到这一点,我不想这样做。这是一个说明问题的片段:
package main
// typedef struct {
// int size;
// void *data;
// } info;
//
// void test(info *infoPtr) {
// // Do something here...
// }
import "C"
import "unsafe"
func main() {
var data uint8 = 5
info := &C.info{size: C.int(unsafe.Sizeof(data)), data: unsafe.Pointer(&data)}
C.test(info)
}
Run Code Online (Sandbox Code Playgroud)
虽然编译正常,但尝试运行它会导致:
panic: runtime error: cgo argument has Go pointer to Go pointer
Run Code Online (Sandbox Code Playgroud)
在我的例子中,传递给 C 调用的数据在调用后不会持续存在(即,有问题的 C 代码深入结构,复制它需要的内容,然后返回)。
我想将大量的对象malloc到内存中(大约1亿个对象),因为golang的gc不够有效,所以我需要使用c/c ++来malloc内存并使用std :: vector来保存对象.这是我的代码,我想在cgo中使用std容器:
package main
import (
"fmt"
)
/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
using namespace std;
void dosome(){
vector<int> ivec; // empty vector
for (vector<int>::size_type ix = 0; ix != 10; ++ix)
ivec[ix] = ix; // disaster: ivec has no elements
}
*/
// #cgo LDFLAGS: -lstdc++
import "C"
//import "fmt"
func main() {
C.dosome()
var input string
fmt.Scanln(&input)
}
Run Code Online (Sandbox Code Playgroud)
并在下面有错误消息:
go run stddemo.go
# command-line-arguments
./stddemo.go:13:10: fatal error: 'vector' file not found
#include …Run Code Online (Sandbox Code Playgroud)