variables - Go中函数体外部的非声明语句

标签 variables scope go package global

我正在为提供 JSON 或 XML 格式数据的 API 构建 Go 库。

此 API 要求我每 15 分钟左右请求一次 session_id,并在调用中使用它。例如:

foo.com/api/[my-application-id]/getuserprofilejson/[username]/[session-id]
foo.com/api/[my-application-id]/getuserprofilexml/[username]/[session-id]

在我的 Go 库中,我试图在 main() 函数之外创建一个变量,并打算 ping 它以获取每个 API 调用的值。如果该值为 nil 或为空,则请求新的 session id 等等。

package apitest

import (
    "fmt"
)

test := "This is a test."

func main() {
    fmt.Println(test)
    test = "Another value"
    fmt.Println(test)

}

什么是惯用的 Go 方式来声明一个全局可访问的变量,但不一定是一个常量?

我的 test 变量需要:

  • 可以从它自己的包中的任何地方访问。
  • 多变

最佳答案

你需要

var test = "This is a test"

:= 仅在函数中有效,小写的 't' 仅对包可见(未导出)。

更详尽的解释

test1.go

package main

import "fmt"

// the variable takes the type of the initializer
var test = "testing"

// you could do: 
// var test string = "testing"
// but that is not idiomatic GO

// Both types of instantiation shown above are supported in
// and outside of functions and function receivers

func main() {
    // Inside a function you can declare the type and then assign the value
    var newVal string
    newVal = "Something Else"

    // just infer the type
    str := "Type can be inferred"

    // To change the value of package level variables
    fmt.Println(test)
    changeTest(newVal)
    fmt.Println(test)
    changeTest(str)
    fmt.Println(test)
}

test2.go

package main

func changeTest(newTest string) {
    test = newTest
}

输出

testing
Something Else
Type can be inferred

另外,对于更复杂的包初始化或设置包所需的任何状态,GO 提供了一个 init 函数。

package main

import (
    "fmt"
)

var test map[string]int

func init() {
    test = make(map[string]int)
    test["foo"] = 0
    test["bar"] = 1
}

func main() {
    fmt.Println(test) // prints map[foo:0 bar:1]
}

Init 将在 main 运行之前被调用。

关于variables - Go中函数体外部的非声明语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20508356/

相关文章:

url - 存储当前 URL,稍后在 Selenium IDE 中打开它

戈朗 : Running something every few seconds with Ticker

json - golang appengine 输出 json

.net - 我应该在线程启动后保留对线程的引用吗?

go - 在 AST 中查找包引用

mysql - 使用来自 codeigniter 的变量更新一条记录

Java程序无法找到存储在另一个类中的公共(public)变量

php - 确定变量是否是 PHP 中一组变量中最小的

Python:如果在 try 或 if 中定义变量仍然可以访问?

javascript - 'this'指的是什么?