way the many how hashtags for best variables scope go package global

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.