a_ReturnCode a_c_function(const char* inputString1, const char*
inputString2, char** outputString1, char** outputString2,
char** outputString3, bool inputBool1 = false, const char* inputString3 = NULL);
inStr1 := "foo"+string('\x00')inStr2 := "bar"+string('\x00')
inStr3 := "baz"+string('\x00')
var outStr1, outStr2, outStr3 string
ret := A_c_function(inStr1, inStr2, &outStr1, &outStr1, &outStr1, false, inStr3)
log.Infof("Got return code '%d', message '%s', uuid '%s', name '%s'", ret, outStr1, outStr2, outStr3)
//test.c
#include <stdlib.h>#include <string.h>#include <stdio.h>
int get_string(char** return_string){ char* myBuff = (char*) malloc(sizeof(char) * 15);
strcpy(myBuff, "Hello World");
*return_string = myBuff; return 42;}
//test.h
extern int get_string(char** return_string);
//main.go
package main
import "fmt"import "stringtest"
func main() { strPtr := new(string) retInt := stringtest.Get_string(&strPtr) fmt.Printf("'%d', '%s'\n", retInt, *strPtr)}
'42', ''
%module stringtest%include<typemaps.i>%{#include "test.h" %}
%go_import("C")
%insert(go_header)%{
type StringReturner **C.charfunc NewStringReturner() StringReturner { ptr := new(C.char) return &ptr}
func Return(this StringReturner) string { str := C.GoString(*this)
C.free(*this)
C.free(this) return str}
%}
%typemap(gotype) char** "StringReturner"
int get_string(char **return_string);
package main
import "C"import "fmt"import "stringtest"
func main() { strPtr := stringtest.NewStringReturner() retInt := stringtest.Get_string(strPtr) fmt.Printf("'%d', '%s'\n", retInt, stringtest.Return(strPtr))}
'42', 'Hello World'
Of course, the cgo updates in 1.6 break this
Use
var arr [1]C.char
ptr := &arr[0]
Or
ptr := (*C.char)(unsafe.Pointer(C.malloc(C.sizeof_void)))