在C中使用GoString

时间:2015-06-18 13:40:45

标签: c go cgo

感谢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“长   很长“)也得到了错误的价值。

     

所以看来我的问题不在于字符串编码或空终止   但可能与我如何编译整个事情

我将很快添加所有编译步骤

2 个答案:

答案 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应用程序,这是一个重要但微妙的差异。

这就是我想要做的事情,这就是为什么它失败了。

我现在正在研究the new -buildmode=c-shared option