// main.go
package main
// int plus(int a, int b)
import "c"
import (
"fmt"
)func main()
go mod init demo
目錄結構+ demo
- main.go
- go.mod
-+ c_code
-- test.h
-- test.c
-- test.go
**// c_code/test.h
#ifndef test_h
#define test_h
int plus(int a, int b);
#endif
// c_code/test.c
#include "test.h"
int plus(int a, int b)
// c_code/test.go
package c_code
/*#include "test.h"
*/import "c"
func plus(v1 int, v2 int) int
// main.go
package main
import (
"demo/c_code"
"fmt"
)func main()
// test.h
#ifndef test_h
#define test_h
struct number ;
void init_number(struct number *n, int value);
int plus(struct number *a, struct number *b);
#endif
// test.c
#include "test.h"
void init_number(struct number *n, int value)
int plus(struct number *a, struct number *b)
package c_code
/*#include "test.h"
#include */
import "c"
import (
"unsafe"
)func plus(v1 int, v2 int) int
main函式無需修改
// c_code/test.h
#ifndef test_h
#define test_h
typedef void (*callback) (void *);
void register_callback(callback cb, void *go_func);
#endif
// c_code/test.c
#include "test.h"
void register_callback(callback cb, void *go_func)
// c_code/test.go
package c_code
/*#include "test.h"
void go_callback_proxy();
*/import "c"
import (
"unsafe"
)//export go_callback_proxy
func go_callback_proxy(p unsafe.pointer)
func registercallback(f *func())
// main.go
package main
import (
"demo/c_code"
"fmt"
)func main()
c_code.registercallback(&callback)
}
只需要將引數從函式指標修改為go struct的指標, 然後go_callback_proxy()函式 做相應修改即可
傳入c的 golang的struct指標 如果其指有指向其他go資料結構的指標, 執行的時候可能會報錯:
panic: runtime error: cgo argument has go pointer to go pointer
通過設定 export godebug=cgocheck=0 環境變數可以解決
但是使用的時候要注意記憶體安全cgo
轉換方法
char
byte
c.char
signed char
int8
c.schar
unsigned char
uint8
c.uchar
short int
int16
c.short
short unsigned int
uint16
c.ushort
intint
c.int
unsigned int
uint
c.uint
long long int
int64
c.longlong
float
float32
c.float
double
float64
c.double
void *
unsafe.pointer
struct foo *
unsafe.pointer
(*c.struct_foo)()
char * 字串
string
c.cstring c.gostring
cgo使用libevent庫實現乙個定時器
go和c互相呼叫指標 git clone cd libevent mkdir build cd build cmake make main.cpp include event.h struct event ev struct timeval tv void time cb evutil socket...
HTML示例與總結
1.html基本框架 檔案開始.放置網頁要顯示的內容 檔案結束2.常用html標記 1 文字標題分為6個級別h1到h6字型逐級減小 2 段落 在html網頁中用 段落的內容 3 對齊 a 段落居中 頭 尾ii 頭 尾 4 滾動 5 符號 換行符 6 列表 a 無序列表 b 有序列表 列表項.列表項....
SharpZipLib使用示例
sharpziplib使用示例 zipinputstream gzipinputstream用於解壓縮deflate gzip格式流,zipoutputstream gzipoutputstream用於壓縮deflate gzip格式流。streamutil類包含了幾個stream處理輔助方法 co...