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:
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.
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.
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
}
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