web-dev-qa-db-ja.com

Goの関数本体外の非宣言ステートメント

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() 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変数には以下が必要です:

  • 独自のパッケージ内のどこからでもアクセスできます。
  • 変更可能
46
sergserg

あなたが必要

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が実行される前に呼び出されます。

65
robbmj

誤って「Func」または「function」または「Function」の代わりに「func」を使用すると、以下も取得します:

関数本体外の非宣言ステートメント

これを投稿したのは、最初に検索でここで何が間違っていたのかを突き止めたからです。

16
J.M.I. MADISON

以下のように変数を宣言できます。

package main

import (
       "fmt"
       "time"
)

var test = "testing"
var currtime = "15:04:05"
var date = "02/01/2006"

func main() {
    t := time.Now()
    date := t.Format("02/01/2006")
    currtime := t.Format("15:04:05")

    fmt.Println(test) //Output: testing
    fmt.Println(currtime)//Output: 16:44:53
    fmt.Println(date) // Output: 29/08/2018
}
1
Walk
Outside a function, every statement begins with a keyword (var, func, and so on) and so the := construct is not available.

詳細については、こちらをご覧ください==> https://tour.golang.org/basics/1