感谢cgo
,我正试图在C程序中使用一些Go代码我的Go文件如下所示:
package hello
import (
"C"
)
//export HelloWorld
func HelloWorld() string{
return "Hello World"
}
我的C代码是这样的:
#include "_obj/_cgo_export.h"
#include <stdio.h>
int main ()
{
GoString greeting = HelloWorld();
printf("Greeting message: %s\n", greeting.p );
return 0;
}
但我得到的输出并不是我的预期:
问候留言:
我猜它是一个编码问题,但是关于它的文档非常少,我几乎一无所知。
你知道那段代码出了什么问题吗?
编辑:
正如我刚才在下面的评论中所说:
我[...]试图返回并打印一个Go int(这是一个C“长 很长“)也得到了错误的价值。
所以看来我的问题不在于字符串编码或空终止 但可能与我如何编译整个事情
我将很快添加所有编译步骤
答案 0 :(得分:2)
printf
期望以NUL结尾的字符串,但Go字符串不是NUL终止的,因此您的C程序表现出未定义的行为。请改为:
#include "_obj/_cgo_export.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
GoString greeting = HelloWorld();
char* cGreeting = malloc(greeting.n + 1);
if (!cGreeting) { /* handle allocation failure */ }
memcpy(cGreeting, greeting.p, greeting.n);
cGreeting[greeting.n] = '\0';
printf("Greeting message: %s\n", cGreeting);
free(cGreeting);
return 0;
}
或:
#include "_obj/_cgo_export.h"
#include <stdio.h>
int main() {
GoString greeting = HelloWorld();
printf("Greeting message: ");
fwrite(greeting.p, 1, greeting.n, stdout);
printf("\n");
return 0;
}
或者,当然:
func HelloWorld() string {
return "Hello World\x00"
}
答案 1 :(得分:0)
这个评论很好地描述了我的问题:Call go functions from C
您可以从C调用Go代码,但目前您无法嵌入Go 运行时进入C应用程序,这是一个重要但微妙的差异。
这就是我想要做的事情,这就是为什么它失败了。