一尘不染

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

go

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

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

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 等等。

package apitest

import (
    "fmt"
)

test := "This is a test."

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

}

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

我的test变量需要:

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

阅读 178

收藏
2021-12-21

共1个答案

一尘不染

你需要

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 运行之前被调用。

2021-12-21