如何将Go func转换为uintptr?

jtw3ybtb  于 2023-04-27  发布在  Go
关注(0)|答案(1)|浏览(107)

我需要在Go代码中传递和接收Go函数。
由于Go语言中系统调用的工作方式,用于“passage”的类型是uintptr
除了uintptr,我没有其他选择,因为syscall.SyscallN接受并返回此类型。
如何将Go语言的func转换为uintptr
我试着在沙盒里玩它,但我不能简单地转换它。

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var f MyFunc = SumInt
    fmt.Println(f(1, 2))
    test(uintptr(f))                 // Cannot convert an expression of the type 'MyFunc' to the type 'uintptr'
    test(uintptr(unsafe.Pointer(f))) // Cannot convert an expression of the type 'MyFunc' to the type 'unsafe.Pointer'
}

type MyFunc func(a int, b int) (sum int)

func SumInt(a, b int) int {
    return a + b
}

func test(x uintptr) {
    var xf MyFunc
    xf = MyFunc(x)                 // Cannot convert an expression of the type 'uintptr' to the type 'MyFunc'
    xf = MyFunc(unsafe.Pointer(x)) // Cannot convert an expression of the type 'unsafe.Pointer' to the type 'MyFunc'
    fmt.Println(xf(1, 2))
}

我在互联网上搜索,但这些信息在谷歌上是看不到的。
谢谢大家。

sqougxex

sqougxex1#

我找到了一个方法!我需要传递一个指向函数的指针。

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var f MyFunc = SumInt
    fmt.Println(f(1, 2))
    test(uintptr(unsafe.Pointer(&f)))
}

type MyFunc func(a int, b int) (sum int)

func SumInt(a, b int) int {
    return a + b
}

func test(x uintptr) {
    var xfp *MyFunc
    xfp = (*MyFunc)(unsafe.Pointer(x))

    var xf MyFunc
    xf = *xfp
    fmt.Println(xf(1, 2))
}
3
3

Process finished with the exit code 0

相关问题