我正在为提供 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/