Skip to content

Instantly share code, notes, and snippets.

@importre
Created October 12, 2013 15:08
Show Gist options
  • Save importre/6950989 to your computer and use it in GitHub Desktop.
Save importre/6950989 to your computer and use it in GitHub Desktop.
how to turn char ** into []string in Go
package main
import (
"errors"
"fmt"
"log"
"reflect"
"unsafe"
)
/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char** getDoubleArray(int *size) {
int i;
char buff[1024];
*size = 'z' - 'a' + 1;
char **list = (char **)malloc(*size * sizeof(char *));
if (NULL == list) {
*size = 0;
return NULL;
}
for (i = 0; i < *size; i++) {
sprintf(buff, "%c [0x%02X]", 'a' + i, 'a' + i);
list[i] = strdup(buff);
}
return list;
}
*/
import "C"
func main() {
var size C.int
ptr := unsafe.Pointer(C.getDoubleArray(&size))
lines, err := StringArrayList(ptr, int(size))
if err != nil {
log.Fatal(err)
}
for _, line := range lines {
fmt.Println(line)
}
}
func StringArrayList(ptr unsafe.Pointer, size int) ([]string, error) {
if nil == ptr || 0 == size {
return nil, errors.New("params error")
}
var slice []*C.char
header := (*reflect.SliceHeader)((unsafe.Pointer(&slice)))
header.Cap = size
header.Len = size
header.Data = uintptr(unsafe.Pointer(ptr))
ret := make([]string, size)
for i := 0; i < size; i++ {
verb := C.GoString(slice[i])
C.free(unsafe.Pointer(slice[i])) // free if needed
ret[i] = verb
}
C.free(ptr) // free if needed
return ret, nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment