登录
首页 >  Golang >  Go问答

cgo 在 cgo 头中编写 func 来打印数据,但没有打印任何内容

来源:stackoverflow

时间:2024-04-10 13:00:36 276浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《cgo 在 cgo 头中编写 func 来打印数据,但没有打印任何内容》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我正在尝试使用 vscode 和 vscode-go 编写一个小型 cgo 应用程序。

我的问题至少深陷三个层次。我需要将 go 字符串复制到分配的 c 缓冲区,然后将其在结构内部传递给 c 库提供的函数。该函数返回的错误没有为我提供足够的信息,因此我尝试检查传递给该函数的内容。我不确定我是否正确执行了内存复制,因此我想在 cgo 标头中编写一个 c 函数,我可以调用该函数来从地址打印出多个十六进制字节。我现在遇到的问题是该方法不打印任何内容,甚至不打印简单的 printf 语句。

我的 cgo 标头如下所示:

/*
#cgo cflags: -g -wall -i${srcdir}/../include
#cgo ldflags: -l${srcdir}/../lib/linux ...
#include 
#include 
#include 
#include "..."

typedef struct {
    int size;
    void *data;
} info;

void printbytes(info *data) {
    printf("in printbytes.");
}

*/

在同一模块中的一个函数中,我有以下代码:

plaintextBuffer := C.malloc(C.ulong(C.sizeof_char * len(data)))

buf := (*[1 << 30]byte)(plaintextBuffer)
copy(buf[:], data)

fmt.Println("About to call printBytes.")
info := &C.info{size: C.int(len(data)), data: plaintextBuffer}
C.printBytes(info)

我根本不确定将字符串复制到缓冲区的这两行是否正确,但它们会编译并且运行时不会恐慌,所以它们不会那么糟糕。 :)

无论如何,我想通过调用“printbytes”函数(显然需要更多代码来完成一些有用的事情)来验证它是否确实正常工作。对于第一个测试,我只想看到“in printbytes”。当我运行它时。然而,当我运行它时,我看到的是什么也没有。我看到“about to call ...”行,然后是此代码后面的打印语句。

我还尝试将 def 和引用中的“printbytes”和“info”更改为“printbytes”和“info”(只是类型),这对结果没有影响。

我可以就其中任何一个问题使用建议,首先是为什么该函数不打印任何内容,或者是关于复制代码是否正确的建议,或者其他任何内容。


正确答案


转到1.7

plaintextBuffer := C.malloc(C.ulong(C.sizeof_char * len(data)))
C.free(unsafe.Pointer(plaintextBuffer))
slice := unsafe.Slice((*byte)(plaintextBuffer), len(data))
copy(slice[:], data)
fmt.Print(slice)

今天关于《cgo 在 cgo 头中编写 func 来打印数据,但没有打印任何内容》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>