Tag:

cgo结果已经指针

我正在编写一些导出类似函数的代码: package main import “C” //export returnString func returnString() string { // gostring := “hello world” return gostring } func main() {} 我使用go build -buildmode = c-shared构建.so和头文件,但是当我在我的C代码中调用returnString()时,我得到“恐慌:运行时错误:cgo结果有Go指针” 在1.9中有没有办法解决这个问题?

在多种编程语言中寻找类似精度的数据类型,例如C / C ++,D,Go

我正在尝试使用两种或更多编程语言实现具有浮点数的程序。 该程序确实说50k迭代最终将错误带到非常小的值。 为了确保我的结果具有可比性,我想确保在不同语言中使用相同精度的数据类型。 你能否告诉C / C ++的float / double与D和Go之间是否存在对应关系。 我希望C / C ++和D在这方面非常接近,但不确定。 非常感谢。

CGO:如何在Golang中使用指针从C中访问数组中的数据

我正在使用FFmpeg编写一个用于Windows平台的应用程序,它是golang包装器goav,但是我无法理解如何使用C指针来访问他们指向的数据数组。 我正在尝试将数据存储在AVFrame类中,并使用Go将其写入文件,最后使用OpenGl中的纹理来制作具有很酷转换的video播放器。 我认为理解如何投射和访问C数据将使编码变得更加容易。 我已经删除了C代码的所有相关部分,包装器和我的代码,如下所示: C代码 – libavutil / frame.h #include typedef struct AVFrame { #define AV_NUM_DATA_POINTERS 8 uint8_t *data[AV_NUM_DATA_POINTERS]; } Golang goav包装器 – 我真的不知道这里有什么不安全的.Pointers和cast但它让我可以访问底层的C代码 package avutil /* #cgo pkg-config: libavutil #include #include */ import “C” import ( “unsafe” ) type Frame C.struct_AVFrame func AvFrameAlloc() *Frame { return (*Frame)(unsafe.Pointer(C.av_frame_alloc())) } func Data(f *Frame) *uint8 { return […]

C write call和Go syscall.Write之间的区别

syscall write返回-1并设置errno是一个简单的例子。 如果C write调用返回零或正数,我感兴趣的是errno的状态。 如果errno对于任何情况都不为零,则Go中的包装器syscall.Write只返回err ,其中还包括write调用返回正数的情况。 https://github.com/golang/go/blob/3cb64ea39e0d71fe2af554cbf4e99d14bc08d41b/src/syscall/zsyscall_linux_386.go#L1007 但是,如果我们编写零长度缓冲区而不解释任何细节,则C write调用的手册页大致描述了errno 也可能被设置但未指定。 因此,以下案例似乎不清楚: 如果write调用为文件,非阻塞套接字或阻塞套接字返回0,则errno的状态是什么? 何时以及如何write调用返回0并且errno不为0? 如果write调用返回正数,则errno的状态是什么? 它会消极吗? 有没有其他系统调用可能会遇到相同的情况? 我认为上面的描述指出了C write调用和Go syscall.Write之间的区别,这对开发人员来说还不清楚,以下是我的想法: 根据手册页,在C write调用文件和非阻塞套接字中明确定义了返回零,但是不清楚是否存在阻塞套接字的非错误条件,这会导致write()无阻塞,如果重试,则返回0,并且(可能)稍后可能成功。 确实Go直接包装系统调用write 。 但是,以下代码片段似乎不安全,因为written等于零的情况可能会触发err但我们不想破坏循环: func writeAll(fd int, buffer []byte) bool { length := len(buffer) for length > 0 { written, err := syscall.Write(fd, buffer) if err != nil { // here return false } length […]

如何从Golang访问C指针数组

我正在使用FFmpeg编写一个用于Windows平台的应用程序,它是golang包装器goav,但我无法理解如何使用C指针来获取对数组的访问权限。 我正在尝试将存储在AVFormatContext类中的流用于go,并最终将帧添加到OpenGl中的纹理以使video播放器具有很酷的过渡。 我认为理解如何投射和访问C数据将使编码变得更加容易。 我已经删除了C代码的所有相关部分,包装器和我的代码,如下所示: C代码 – libavformat / avformat.h typedef struct AVFormatContext { unsigned int nb_streams; AVStream **streams; } Golang goav包装纸 package avutil //#cgo pkg-config: libavformat //#include import “C” import ( “unsafe” ) type Context C.struct_AVFormatContext; func (ctxt *Context) StreamsGet(i uintptr) *Stream { streams := (**Stream)(unsafe.Pointer(ctxt.streams)); // I think this is where it’s going wrong, […]

如何使用指向C数据的指针在Golang中写入文件?

我正在使用FFmpeg编写一个用于Windows平台的应用程序,它是golang包装器goav,但我无法理解如何使用C指针来获取对数组的访问权限。 我正在尝试将来自C的uint8指针指向的帧数据写入golang中的.ppm文件。 一旦我完成了这个,为了certificateFFmpeg正在做我期望的概念,我想在OpenGl中将帧设置为纹理,以使video播放器具有很酷的过渡; 任何指向做得好而有效的指针将非常有帮助! 我猜我需要写一些着色器代码来绘制ppm作为纹理…… PPM文件结构看起来非常简单,只有标题,然后是从左上角到右下角的帧中每个像素的每个红色,绿色和蓝色值的数据字节 我开始理解如何在C和Go类型之间转换指针,但是我如何访问数据并在Go中写入与C相同的结果? 在CI中,只需设置数据的指针偏移量并说明要写入多少: for (y = 0; y data[0]+y*pFrame->linesize[0], 1, width*3, pFile); } 我已经删除了C代码的所有相关部分,包装器和我的代码,如下所示: C代码 – libavutil / frame.h #include typedef struct AVFrame { #define AV_NUM_DATA_POINTERS 8 uint8_t *data[AV_NUM_DATA_POINTERS]; int linesize[AV_NUM_DATA_POINTERS]; } Golang goav包装纸 package avutil /* #cgo pkg-config: libavutil #include #include */ import “C” import ( “unsafe” ) type […]

涉及C.free()的C和Go互操作性问题

我有一个Go函数,它包装了lib_proc.h的proc_name(pid,…)函数。 这是完整的C原型 : int proc_name(int pid, void * buffer, uint32_t buffersize) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); 可以在这里找到/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/libproc.h (至少在我的系统上)。 它遵循Go代码: package goproc /* #include “libproc.h” int call_proc_name(int pid, char *name, int name_size) { return proc_name(pid, name, name_size); } */ import “C” import “unsafe” import “strings” type DarwinProcess struct { Process } func (DarwinProcess) NameOf(pid int) string { name := […]

如何从strace输出中解码此信息

我写了一个小的go脚本,并使用strace通过这个脚本跟踪它,我试图使用netlink协议从内核获取审计消息,就像auditd一样。 以下是我去的脚本输出 – http://paste.ubuntu.com/8272760/ 我试图找到auditd提供给sendto函数的参数。 当我在auditd上运行strace时,我得到以下输出 sendto(3, “\20\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0”, 16, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 16 当我扫描我的go文件时,我得到以下输出。 我想解码这个陈述的第二个参数 sendto(3, “\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t”, 17, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 17 再具体一点 “\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t” 现在我想将其转换为字符串或字节数组,有没有办法将其转换为字符串或字节数组? 在我的实际go代码中,这个参数是一个字节数组。 https://github.com/mozilla/Audit-Go/blob/testing/netlink_old.go#L58

如何在go中将指针传递给切片到C函数

背景:使用cgo从Golang调用C函数。 我想使用具有此签名的C函数: int f(int *count, char ***strs) 。 它将修改count和strs的数据,这就是它使用指针的原因。 count的值是strs的长度; strs是一个字符串数组; 返回值只是一个(布尔)指示符,指示是否存在错误。 在golang中,我可以通过使用Cf((*C.int)(&count))成功传递和修改count ; 使用[]*C.char传递[]string 。 示例代码如下: /* #include int f(int *c, char **str) { int i; printf(“%d\n”, *c); for (i = 0; i < *c; i++) { printf("%s\n", str[i]); } *c = (*c) + 1; return 1; } */ import "C" func go_f(strs []string) […]

在GoLang应用程序中使用C(++)来提高性能

我几天前就开始研究Go了,它来自CGO的东西和gccgo编译器。 根据我的理解,这允许使用Go编译器编译Go程序并使用C编译器编译C库并从Go程序内引用这些库。 这对我来说非常有趣,因为这使我们可以从主程序中利用C的性能(如果需要),而且开销很小。 但是我不确定那是多么的少,所以我在这里问: 是否有创建C库的情况只是为了在Go应用程序中使用它? 或者此function仅用于促进现有C代码的可重用性? PS:我认为目前CGO不支持C ++,但是有人发表了一篇能够使用C函数包装C ++代码并成功调用它们的post。