网上一个例子:
通过一个简单的例子来说明,首先是例子的结构,我们仅仅用到了这两个文件:ciconnector.go和rockettest.go
例子结构
原本设定的方法是这两个包里的函数互相调用,那么我们通过代码来看下怎么解决相应的问题。
首先是rockettest.go,这里调用了ciconnector.go中的Test方法,代码如下
package main
import (
"fmt"
"citest"
)
func main() {
str := "hello world"
citest.Test(str, rocketfunction)
}
func rocketfunction(str string) {
fmt.Println(str)
}
这里我们将函数名称作为参数传递给ciconnector.go的Test函数中
接下来我们看下ciconnector.go的代码
package citest
import (
"fmt"
"reflect"
"strconv"
"unsafe"
)
type Callback func(str string)
func Test(str string, callback Callback) {
//pointer 转 string
straddress := &callback
strPiniter := fmt.Sprintf("%d", unsafe.Pointer(straddress))
fmt.Println("connection is", strPiniter)
//string 转 pointer
intPointer, _ := strconv.ParseInt(strPiniter, 10, 0)
var pointer *Callback
pointer = *(**Callback)(unsafe.Pointer(&intPointer))
(Callback)(*pointer)(str)
}
参考链接:
理解一下就是:
A.go 调用 B.go 中的函数, B.go中的函数又调用了 A.go中的函数,那么就把A.go中的函数作为参数传入B.go的函数中
作为Callback 类型的参数传入之后,转换为地址,然后再转换成string,再转换成十进制数字,再转换成函数指针
然后执行调用
很晦涩。。。