variables - the - instagram hashtags 2018
Declaración de no declaración fuera del cuerpo de la función en Go (2)
Estoy construyendo una biblioteca Go para una API que ofrece datos con formato JSON o XML.
Esta API requiere que solicite un session_id
cada 15 minutos más o menos, y lo uso en llamadas. Por ejemplo:
foo.com/api/[my-application-id]/getuserprofilejson/[username]/[session-id]
foo.com/api/[my-application-id]/getuserprofilexml/[username]/[session-id]
En mi biblioteca Go, intento crear una variable fuera del func main()
y tengo la intención de hacer ping para obtener un valor por cada llamada API. Si ese valor es nulo o está vacío, solicite una nueva identificación de sesión y así sucesivamente.
package apitest
import (
"fmt"
)
test := "This is a test."
func main() {
fmt.Println(test)
test = "Another value"
fmt.Println(test)
}
¿Cuál es la forma idiomática de declarar una variable globalmente accesible, pero no necesariamente una constante?
Mi variable de test
necesita:
- Ser accesible desde cualquier lugar dentro de su propio paquete.
- Ser cambiable
Necesitas
var test = "This is a test"
:=
solo funciona en funciones y la minúscula ''t'' es para que solo sea visible para el paquete (no exportado).
Una más por explenation
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
}
salida
testing
Something Else
Type can be inferred
Alternativamente, para inicializaciones de paquetes más complejas o para establecer cualquier estado requerido por el paquete, GO proporciona una función 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 se invocará antes de que se ejecute main.
Si accidentalmente usas " Func " o " función " o " Función " en lugar de " func ", también obtendrás:
declaración de no declaración fuera del cuerpo de la función
Publicando esto porque inicialmente terminé aquí en mi búsqueda para descubrir qué estaba mal.