Une histoire accro aux variables globales et à la portée de Go

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.

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

Quand avez-vous des ennuis?

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.

Sommaire

Si vous ne comprenez pas les spécifications linguistiques, vous en serez accro.

Recommended Posts

Une histoire accro aux variables globales et à la portée de Go
Une histoire sur Python pop and append
Variables globales et locales 2
Une histoire sur la modification de Python et l'ajout de fonctions
Variables globales et locales 1
Histoire autour de la maternelle, de l'école maternelle, du jardin d'enfants
À propos des variables et des objets Python
Une histoire rafraîchissante sur Slice en Python
Une histoire de mauvaise humeur sur Slice en Python
L'histoire de l'utilisation de la réduction de Python
Une histoire d'essayer d'exécuter JavaScripthon sur Windows et d'abandonner.
L'histoire d'avoir un regard doux et douloureux sur les utilisateurs personnalisés sur Django
Une histoire sur un remodelage magique qui met Lubuntu dans un Chromebook
Une histoire reliant Slack et la feuille de calcul Google
Une histoire sur l'automatisation du mahjong en ligne (Jakutama) avec OpenCV et l'apprentissage automatique
Une histoire sur l'apprentissage automatique avec Kyasuket
L'histoire de l'abandon d'essayer de se connecter à MySQL en utilisant Heroku
L'histoire de la manipulation des variables globales Python
À propos de _ et __
Une histoire d'essayer d'installer uwsgi sur une instance EC2 et d'échouer
Une histoire de compilation croisée d'un package Python pour AWS Lambda et de son déploiement sans serveur
Une histoire sur l'apprentissage automatique simple avec TensorFlow
Une histoire sur l'exploitation d'une instance GCP à partir de Discord
L'histoire de vouloir afficher des annonces liées à des articles sur Jubatus
Une histoire sur l'implémentation d'un écran de connexion avec django
Une histoire sur l'exécution de Python sur PHP sur Heroku
Histoire de l'analyse de données par apprentissage automatique
À propos de la portée des variables. .. ..
Premiers pas avec python3 # 2 En savoir plus sur les types et les variables
Une histoire que Seaborn était facile, pratique et impressionnée
Histoire de l'utilisation du jeton logiciel de Resona avec 1Password
Une histoire de prédiction du taux de change avec Deep Learning
L'histoire de la migration de l'intégralité du disque Linux via SSH
L'histoire de la création d'une partition de type Hanon avec Python
Une histoire d'essayer un monorepo (Golang +) Python avec Bazel
Une histoire qui reflète l'activité Discord dans Slack Status
Une histoire sur la difficulté à traiter en boucle 3 millions de données d'identification
L'histoire de la gestion de theano avec TSUBAME 2.0
Une histoire sur le changement du nom principal de BlueZ
Une histoire sur un débutant Linux passant LPIC101 en une semaine
Une histoire sur un débutant Linux mettant Linux sur une tablette Windows
Une histoire de trébucher sur PATH après l'installation d'anaconda
[Python] Démarrez un fichier de commandes à partir de Python et passez des variables.
(Remarque) Une histoire sur la création d'un système de questions et réponses à l'aide de Spring Boot et de l'apprentissage automatique (SVM).
L'histoire de la construction d'un serveur de cache PyPI (avec Docker) et de me rendre un peu heureux à nouveau
(Premier article) Une histoire sur le calcul numérique de la grippe et du nouveau coronavirus de la pneumonie avec Tensorflow
Une histoire sur le portage du code de "Essayez de comprendre comment fonctionne Linux" sur Rust