# aardio 范例: 调用 Go 语言 - 回调函数



```aardio
//aardio 调用 Go 语言 - 回调函数
import golang;
var go = golang();

go.main = /********** 
package main

/*  
typedef int _stdcall (*addCallBack)(int a,int b);

//用 C 函数回调 aardio 函数
static int callAddCallBack(void* fnAdd,int a,int b){
	return ((addCallBack)fnAdd)(a,b);
}
*/
import "C" //C 代码写在这一句前面
import "unsafe"

//export TestCallBack 
func TestCallBack(fnCallback unsafe.Pointer) int{
	
	//用 C 函数回调 aardio 函数，改用 aardio.callPtr() 更简单一些。
	var r = C.callAddCallBack(fnCallback,123,2)
	
	//C.int 转换为 Go 类型： int 	 
	return int(r)
}

func main() {} 
**********/

go.buildShared("/.go/cgoCallback.go");

//------------------下面调用 DLL-----------------------
import console.int;

//加载 Go 编译的 DLL
var goDll = raw.loadDll("/.go/cgoCallback.dll",,"cdecl");
 
/*
创建 C 回调函数指针，
文档:  https://www.aardio.com/zh-cn/docs/library-guide/builtin/raw/callback.html

注意：aardio 与 Go 导出函数所在的默认 goroutine 
之间的互调属于同一线程（这里不用考虑多线程），不必使用 thread.tostdcall）。
*/
var callback = raw.tostdcall(
	function(a,b){
		return a+b;
	},"int(int a,int b)");

var ret  = goDll.TestCallBack( callback )

console.log(ret);
```

