web-dev-qa-db-fra.com

Déclaration de non-déclaration en dehors du corps de fonction dans Go

Je crée une bibliothèque Go pour une API qui propose des données au format JSON ou XML.

Cette API m'oblige à demander un session_id Toutes les 15 minutes environ, et à l'utiliser dans les appels. Par exemple:

foo.com/api/[my-application-id]/getuserprofilejson/[username]/[session-id]
foo.com/api/[my-application-id]/getuserprofilexml/[username]/[session-id]

Dans ma bibliothèque Go, j'essaie de créer une variable en dehors de la fonction main() et j'ai l'intention de la cingler pour une valeur pour chaque appel d'API. Si cette valeur est nulle ou vide, demandez un nouvel identifiant de session, etc.

package apitest

import (
    "fmt"
)

test := "This is a test."

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

}

Quelle est la manière idiomatique de Go de déclarer une variable accessible à l'échelle mondiale, mais pas nécessairement une constante?

Ma variable test doit:

  • Soyez accessible de n'importe où dans son propre package.
  • Soyez modifiable
46
sergserg

Vous avez besoin

var test = "This is a test"

:= ne fonctionne que dans les fonctions et la minuscule 't' est telle qu'elle n'est visible que pour le package (non exportée).

Une explication plus approfondie

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
}

sortie

testing
Something Else
Type can be inferred

Alternativement, pour des initialisations de packages plus complexes ou pour configurer l'état requis par le package, GO fournit une fonction 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 sera appelé avant l'exécution de main.

65
robbmj

Si vous utilisez accidentellement "Func" ou "function" ou "Function" au lieu de "func" vous Aussi obtenir:

déclaration de non-déclaration en dehors du corps de la fonction

Publier ceci parce que je me suis d'abord retrouvé ici dans ma recherche pour comprendre ce qui n'allait pas.

16
J.M.I. MADISON

Nous pouvons déclarer des variables comme ci-dessous:

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.

Vous pouvez lire plus d'informations ici ==> https://tour.golang.org/basics/1

0