在go中从另一个函数调用变量

Hen*_*nri -4 go

我知道变量在 go 中是按值传递的。但是,我想在此函数外的 func 内调用一个变量。让我给你举个例子:

package main

import (

    "fmt"
)

func Smile(){
  A := 5
}

func main() {

   fmt.Println(A)

}
Run Code Online (Sandbox Code Playgroud)

这给了我 undefine A。

通过 A 的最佳方法是什么?我应该使用指针吗?我怎么做?

icz*_*cza 5

无法从 打印函数中A声明的变量的值。Smile()main()

其主要原因是变量A仅在代码执行进入Smile()函数时才存在,更准确地说是到达A变量声明。在您的示例中,这永远不会发生。

并且即使在其他一些示例中发生这种情况(例如Smile()被调用),一个应用程序可能有多个 goroutine,并且其中多个可能同时执行Smile(),导致应用程序具有多个A变量,彼此独立。在这种情况下,Amain()指什么?

Go 使用块进行词法范围。这意味着A内部声明的变量Smile()只能从 访问Smile()main()函数不能引用它。如果你需要这样的“共享”,你必须ASmile(). 如果同时Smile()main()需要访问它,你必须使它为全局变量,或者你必须将它传递给需要它的功能。

使它成为一个全局变量,这就是它的样子:

var a int

func smile() {
    a = 5
    fmt.Println("a in smile():", a)
}

func main() {
    smile()
    fmt.Println("a in main():", a)
}
Run Code Online (Sandbox Code Playgroud)

此输出(在Go Playground上尝试):

a in smile(): 5
a in main(): 5
Run Code Online (Sandbox Code Playgroud)

main()将其声明为本地 in并将其传递给smile(),这就是它的样子:

func smile(a int) {
    fmt.Println("a in smile():", a)
}

func main() {
    a := 5
    fmt.Println("a in main():", a)
    smile(a)
}
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

a in main(): 5
a in smile(): 5
Run Code Online (Sandbox Code Playgroud)