Il y a des moments où vous devez utiliser des variables globales. Par exemple, il est nécessaire pour l'initialisation au moment du test (j'en étais accro cette fois) J'expliquerai la situation réaliste à laquelle je suis accro plus tard (probablement environ 100 personnes qui sont accro à la même chose), mais allons-y doucement pour le moment dans un format de quiz.
À votre avis, quel est le résultat de la fonction principale ci-dessous?
package main
import (
"fmt"
)
var global string
func main(){
global = "initial state"
fmt.Println(global)
}
Vous entendrez peut-être une voix disant: «Êtes-vous stupide? Juste au cas où la réponse serait
initial state
est. Ensuite, le suivant est ici. (J'omettrai l'importation de la prochaine fois) Veuillez vous attendre à la réponse, non?
var global string
func main(){
global = "initial state"
global ,err := double()
if err != nil{}
fmt.Println(global)
}
func double()(string,error){
return "double",nil
}
C'est toujours facile. La réponse est
double
est.
Au fait, la sortie «globale» est-elle vraiment une «globale» définie globalement?
À propos, il existe un * sql.DB
défini globalement comme exemple d'écriture comme ça. (Je pensais que seule l'erreur non définie serait nouvellement définie si je l'écrivais de cette façon.)
Vient ensuite le sujet principal.
var global string
func main(){
global = "initial state"
global ,err := double()
if err != nil{}
mistake()
fmt.Println(global)
}
func double()(string,error){
return "double",nil
}
func mistake(){
global = "mistake"
}
Selon vous, quelle est la réponse "erreur" ou "double"? La bonne réponse est
double
est.
Il semble que global
dans error () ʻet
global qui utilisait
: = dans la fonction principale soient traités comme des variables différentes. Si cela se produit, existe-t-il un moyen de faire référence au
global` global depuis la fonction principale ...
J'ai l'impression d'avoir des problèmes lorsque je suis dans une situation comme ce quiz, mais je suis dans une situation très réaliste.
Voir l'exemple ci-dessous. Définit la fonction setUp
pour initialiser le * sql.DB
utilisé dans le test.
Cependant, dans ce cas, un nouveau "Db" est défini uniquement dans la fonction "setUp", qui est différente du "Db" global, et le "Db" global n'est pas mis à jour.
var Db *sql.DB
func TestMain(m *testing.M){
var t *testing.T
setUp(t)
code := m.Run()
tearDown()
os.Exit(code)
}
func setUp(t *testing.T){
Db, err := sql.Open("mysql", "mysql:mysql@/mission")
if err != nil {
t.Error("Error: Could not connect database",err)
}
}
Alors je dois écrire comme ça. (Je ne sais pas si c'est la meilleure pratique.)
var Db *sql.DB
func TestMain(m *testing.M){
var t *testing.T
setUp(t)
code := m.Run()
tearDown()
os.Exit(code)
}
func setUp(t *testing.T){
db, err := sql.Open("mysql", "mysql:mysql@/mission")
if err != nil {
t.Error("Error: Could not connect database",err)
}
Db = db
}
Cela évite le problème de la nouvelle définition de «Db» dans la fonction de configuration et vous permet d'utiliser un «Db» commun tout au long du test.
Si vous ne comprenez pas les spécifications linguistiques, vous en serez accro.
Recommended Posts