cgo使用示例總結

2022-07-28 00:15:24 字數 3109 閱讀 3324

// 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...