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

Golang中传入函数名到fmt.Println为何打印内存地址?

Go中直接打印函数名为何输出内存地址?

在Go语言里,函数本身就是一种值类型,它代表着一段可执行代码的引用——说白了,函数的代码段确实是存储在内存中的,就像变量会占用内存空间一样。

当你写fmt.Println(foo)而不是foo()时,你并没有调用这个函数,而是把函数foo本身作为参数传给了Println。fmt.Println处理函数类型的值时,默认会输出它在内存中的存储地址。

至于每次运行地址不同,是因为现代操作系统普遍开启了**地址空间随机化(ASLR)**机制,它会随机分配程序内存区域的起始地址,目的是提升程序安全性,防止恶意程序利用固定内存地址的漏洞搞事情。

举个直观的例子:

package main

import "fmt"

func foo() {
	fmt.Println("我是被调用的foo函数")
}

func main() {
	// 直接打印函数本身,输出内存地址
	fmt.Println(foo)
	// 加括号才是调用函数,执行里面的代码
	foo()
}

运行这段代码,你会先看到一串类似0x10458bda0的地址,然后才会打印我是被调用的foo函数。

你还能把函数赋值给同类型的变量,比如:

var f func() = foo
fmt.Println(f) // 同样会输出函数的内存地址

这也能证明函数可以像普通变量一样被传递、存储,它的本质就是指向内存中代码段位置的引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:55:22