猿问

Golang 运行在虚拟机上吗?

说一些非常简单的 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 需要一个操作系统才能运行,实际上现在只能在少数操作系统上运行。非常常规的函数指针是否意味着这适用于虚拟机?或者编译器只是链接到低级 C 函数?


ibeautiful
浏览 331回答 3
3回答

慕运维8079593

Go 不在虚拟机上运行。从语言规范来看,ptr和ptr2都是函数值。它们可以被称为ptr(1, 2)和ptr2(1, 2, 3)。深入到实现中,变量ptr和ptr2指向 func 值的指针。有关func 值的信息,请参阅函数调用设计文档。注意语言的“function”值和实现的“func”值之间的区别。因为fmt包使用的反射API 是通过 func 值间接获取要打印的指针,所以调用 来打印函数的实际地址。fmt.Println(ptr)plus

函数式编程

它们是函数值:package mainimport "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))}输出:0x200000x2002036
随时随地看视频慕课网APP

相关分类

Go
我要回答