I am using cgo
in a project, and I want to export a function for use. Here's an example of what I want to achieve:
package csplit
import (
"C"
"strings"
)
//export Split
/* The Split function takes two C strings, the second of which represents
a substring to split on, and returns an array of strings. Example:
Split("1,2", ",") // gives ["1", "2"]
*/
func Split(original *C.char, split *C.char) []*C.char {
goResult := strings.Split(C.GoString(original), C.GoString(split))
cResult := make([]*C.char, len(goResult))
for idx, substring := range goResult {
cResult[idx] = C.CString(substring)
}
return cResult
}
The problem is that the return type is Go allocated data, and not moved into the C heap. This panics with: runtime error: cgo result has Go pointer
1. The c_str() and strcpy() function in C++ C++ c_str() function along with C++ String strcpy() function can be used to convert a string to char array easily. The c_str() method represents the sequence of characters in an array of string followed by a null character ('\0').
So how to convert String array to String in java. We can use Arrays. toString method that invoke the toString() method on individual elements and use StringBuilder to create String. We can also create our own method to convert String array to String if we have some specific format requirements.
Convert byte array to string using bytes package We can use the bytes package NewBuffer() function to create a new Buffer and then use the String() method to get the string output.
You're returning a Go slice which is allocated in Go, and is a different structure than a C array. You need to allocate an array in C:
//export Split
func Split(original *C.char, split *C.char) **C.char {
goResult := strings.Split(C.GoString(original), C.GoString(split))
cArray := C.malloc(C.size_t(len(goResult)) * C.size_t(unsafe.Sizeof(uintptr(0))))
// convert the C array to a Go Array so we can index it
a := (*[1<<30 - 1]*C.char)(cArray)
for idx, substring := range goResult {
a[idx] = C.CString(substring)
}
return (**C.char)(cArray)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With