简介
go语言在使用 cgo 调用C语言编写的动态链接库是,许多API接口参数都是unsigned char *类型,此时就需要把go语言的[]byte类型转换为unsigned char *类型。
如API定义为:
//mydll.h
void print_buf_hex(unsigned char *buf, int len);
//打印指针buf所指向的内存的内容,长度为len
方法一 强制指针转换
/*
#cgo CFLAGS: -I./inc
#cgo LDFLAGS: -L../bin/libs -lmydll
#include "mydll.h"
*/
import "C"
import (
"unsafe"
//"errors"
"fmt"
)
func print_slice(buf []byte) {
C.print_buf_hex((*C.uchar)(&buf[0]), C.int(len(buf )))
}
方法二 重建C指针及缓冲区
/*
#cgo CFLAGS: -I./inc
#cgo LDFLAGS: -L../bin/libs -lmydll
#include <stdlib.h>
#include "mydll.h"
*/
import "C"
import (
"unsafe"
//"errors"
"fmt"
)
func print_slice(buf []byte) {
bufC := C.CBytes(buf)
defer C.free(unsafe.Pointer(bufC))
C.print_buf_hex(bufC, C.int(len(buf )))
}
区别
方法一:不需要重新申请内存和释放内存
方法二:需要重新申请内存,使用完必须显示的free掉内存。