我正在为提供 JSON 或 XML 格式数据的 API 构建 Go 库。
这个 API 要求我session_id每 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()func之外创建一个变量,并打算为每个 API 调用 ping 一个值。如果该值为 nil 或为空,则请求一个新的会话 ID 等等。
main()
package apitest import ( "fmt" ) test := "This is a test." func main() { fmt.Println(test) test = "Another value" fmt.Println(test) }
声明全局可访问变量但不一定是常量的惯用 Go 方式是什么?
我的test变量需要:
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 运行之前被调用。