You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确将Go语言的func转换为uintptr类型?

Go函数与uintptr的正确转换方法

由于syscall.SyscallN仅支持uintptr类型的参数,要在Go中实现函数与uintptr的互转,必须借助unsafe包完成底层类型转换,以下是正确的实现方式:

修正后的代码示例

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var f MyFunc = SumInt
    fmt.Println(f(1, 2))
    
    // 将函数转换为uintptr:取函数值的底层代码地址
    funcPtr := *(*uintptr)(unsafe.Pointer(&f))
    test(funcPtr)
}

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
    // 将uintptr转回函数类型:把地址赋值给函数值的底层字段
    *(*uintptr)(unsafe.Pointer(&xf)) = x
    fmt.Println(xf(1, 2))
}

关键转换逻辑说明

  1. 函数转uintptr:
    Go的函数值在底层是一个结构体(非闭包函数的结构体仅包含代码地址字段),通过unsafe.Pointer(&f)获取函数值变量的地址,再将其转换为指向uintptr的指针,解引用后就能得到函数的入口地址(uintptr类型)。

  2. uintptr转函数:
    同样通过unsafe.Pointer(&xf)获取目标函数变量的地址,将其转换为指向uintptr的指针,把传入的uintptr值赋值给该指针指向的内存,从而完成函数类型的还原。

注意事项

  • 这种转换依赖Go的底层实现细节,不同Go版本可能存在兼容性风险。
  • 如果转换的是闭包函数,必须确保闭包的捕获变量不会被GC回收,否则调用还原后的函数会触发运行时错误。
  • unsafe包的使用会绕过Go的类型安全检查,需谨慎编写和测试相关代码。

内容的提问来源于stack exchange,提问作者user17471643

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:23:10