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
相关产品推荐
相关产品推荐

