说一些非常简单的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)
}

这有以下输出:

0x2000
0x2020

这里发生了什么?这看起来不像是一个函数指针,或任何类型的指针,可以在堆栈中找到.我也理解Go,虽然在线程部门提供了一些不错的低级功能,但也需要一个操作系统才能运行; C可以在所有计算机平台上运行,操作系统可以写入其中,而Go需要操作系统才能运行,实际上现在只能在少数操作系统上运行.常规函数指针是否意味着它可以在VM上运行?或者编译器是否只链接到低级C函数?



1> hobbs..:

Go不在虚拟机上运行.这些是函数的实际地址.

在我的机器上(去1.4.1,Linux amd64)程序打印

0x400c00
0x400c20

它们与您示例中的值不同,但仍然很低.检查已编译的代码:

$ nm test | grep 'T main.plus'
0000000000400c00 T main.plus
0000000000400c20 T main.plusPlus
func plusplusPlus
func plusobjdump -d
0000000000400c00 :
  400c00:       48 8b 5c 24 08          mov    0x8(%rsp),%rbx
  400c05:       48 8b 6c 24 10          mov    0x10(%rsp),%rbp
  400c0a:       48 01 eb                add    %rbp,%rbx
  400c0d:       48 89 5c 24 18          mov    %rbx,0x18(%rsp)
  400c12:       c3                      retq   


2> Cerise Limón..:

Go不在虚拟机上运行.

ptrptr2ptr(1, 2)ptr2(1, 2, 3)
ptrptr2
fmt.Println(ptr)plus