说一些非常简单的 Golang 代码:package main import "fmt"func plus( a int, b int) int { return a+b}func plusPlus(a,b,c int) int { return a +b + c}func main() { ptr := plus ptr2 := plusPlus fmt.Println(ptr) fmt.Println(ptr2)}这有以下输出:0x20000x2020这里发生了什么?这看起来不像一个函数指针,或者任何类型的指针,可以在堆栈中找到。我也明白 Go,虽然在线程部门提供了一些不错的低级功能,但它也需要一个操作系统才能运行;C 在所有计算机平台上都可以运行,操作系统可以用它编写,而 Go 需要一个操作系统才能运行,实际上现在只能在少数操作系统上运行。非常常规的函数指针是否意味着这适用于虚拟机?或者编译器只是链接到低级 C 函数?
3 回答
慕运维8079593
TA贡献1876条经验 获得超5个赞
Go 不在虚拟机上运行。
从语言规范来看,ptr
和ptr2
都是函数值。它们可以被称为ptr(1, 2)
和ptr2(1, 2, 3)
。
深入到实现中,变量ptr
和ptr2
指向 func 值的指针。有关func 值的信息,请参阅函数调用设计文档。注意语言的“function”值和实现的“func”值之间的区别。
因为fmt包使用的反射API 是通过 func 值间接获取要打印的指针,所以调用 来打印函数的实际地址。fmt.Println(ptr)
plus
函数式编程
TA贡献1807条经验 获得超9个赞
它们是函数值:
package main
import "fmt"
func plus(a int, b int) int {
return a + b
}
func plusPlus(a, b, c int) int {
return a + b + c
}
func main() {
funcp := plus
funcpp := plusPlus
fmt.Println(funcp)
fmt.Println(funcpp)
fmt.Println(funcp(1, 2))
fmt.Println(funcpp(1, 2, 3))
}
输出:
0x20000
0x20020
3
6
- 3 回答
- 0 关注
- 330 浏览
添加回答
举报
0/150
提交
取消