回答

收藏

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

技术问答 技术问答 198 人阅读 | 0 人回复 | 2023-09-12

我正在提供 JSON 或 XML 格式数据 API 构建 Go 库。
- y; }" h! c! h& }7 L这个 API 要求我session_id每15 请求一次,并在调用中使用。" r% S1 z; I( F% R  o2 R9 ]9 @, ?/ A
    foo.com/api/[my-application-id]/getuserprofilejson/[username]/[session-id]foo.com/api/[my-application-id]/getuserprofilexml/[username]/[session-id]7 m) G# [: ], J
在我的 Go 库里,我试着在那里main()func创建一个变量,并计划为每个 API 调用 ping 一个值。如果值是 nil 或者是空的,请求新的会话 ID 等等。( `  G+ R) v6 Y
    package apitestimport  "fmt")test := "This is a test."func main()      fmt.Println(test)    test = "Another value"    fmt.Println(test)}' {% Q4 K; S8 \+ c+ j$ b
声明全局可访问变量,但不一定是常用 Go 的方法是什么?, R; s; ~+ L. G
我的test变量需要:, z- R: v. m" M. q5 R& b. K
可以访问自己包里的任何地方。
% t! E& f0 B3 ~* c/ |多变
                                                                0 f( M; e8 G0 H+ k: O
    解决方案:                                                               
( y  G- |; i3 k9 B6 i                                                                你需要
& o0 {  [. G1 r1 s
    var test = "This is a test"- x. A. C; Y/ y2 w, C
:= 只适用于函数,小写t只对包可见(未导出)。4 o. k2 c+ o2 k7 K
更彻底的解释
4 i2 x! D* `; y3 w8 Vtest1.go/ V! K! U& \8 R5 i- [! K/ O
    package mainimport "fmt"// the variable takes the type of the initializervar 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 receiversfunc 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)}
    : l4 M' }/ w0 |0 ^/ y! v1 ]
test2.go
; E/ {" L7 a  f) M$ T1 ]% D
    package mainfunc changeTest(newTest string)    test = newTest}
    ) Z. e' E2 I8 Y9 {# X
输出
$ l+ T5 D+ n' I& z9 m2 v' y& J
    testingSomething ElseType can be inferred
    % A# c& E5 G& i$ _2 Z7 k2 d5 p
或者,对于更复杂的包初始化或设置包所需的任何状态,GO 提供了一个 init 函数。
! b5 O$ d. K% Z4 A" K
    package mainimport  "fmt")var test map[string]intfunc init()      test = make(map[string]int)    test["foo"] = 0    test["bar"] = 1}func main()      fmt.Println(test) // prints map[foo:0 bar:1]}
    % B2 U: [9 r" A% X7 L/ x
init 将在 main 运行前调用。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则