Вы получаете строку C от вашего звонка до C.ecall_pay_w
и хотите преобразовать эту строку C в строку Go. Вы можете сделать это вручную, следуя по C -строке, пока не достигнете окончания 0
.
При условии, что:
- В конце есть окончание
0
C -строки - C -строка кодируется как ASCII, поэтому каждый байт представляет символ ASCII (в диапазоне [0..127]). Это означает, что это ASCII и UTF-8 одновременно, потому что UTF-8 обратно совместим с ASCII.
Тогда ваше решение может быть таким:
func convertCStringToGoString(c *C.uchar) string {
var buf []byte
for *c != 0 {
buf = append(buf, *c)
c = (*C.uchar)(unsafe.Pointer(uintptr(unsafe.Pointer(c)) + 1))
}
return string(buf)
}
Примечание что делать "небезопасные" вещи, подобные этой, в Go очень тяжело Это было сделано специально 1030 * авторами. Вам нужно конвертировать в unsafe.Pointer
, прежде чем вы сможете конвертировать в uintptr
. uintptr
можно добавить к (+ 1
), в то время как unsafe.Pointer
не поддерживает это. Вот причины такого большого количества кастингов.