网上一个例子:

通过一个简单的例子来说明,首先是例子的结构,我们仅仅用到了这两个文件: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,再转换成十进制数字,再转换成函数指针

然后执行调用

很晦涩。。。