Eine Geschichte, die von Go's globalen Variablen und ihrem Umfang abhängig ist

Es gibt Zeiten, in denen Sie globale Variablen verwenden müssen. Zum Beispiel ist es für die Initialisierung zum Zeitpunkt des Tests erforderlich (diesmal war ich süchtig danach). Ich werde die realistische Situation, von der ich süchtig bin, später erklären (wahrscheinlich etwa 100 Menschen, die von derselben Sache abhängig sind), aber lassen Sie es uns vorerst in einem Quizformat locker angehen.

Quiz

Was denkst du ist die Ausgabe der Hauptfunktion unten?

package main 

import (
	"fmt"
)

var global string

func main(){
	global = "initial state"
	fmt.Println(global)
}

Sie können eine Stimme sagen hören: "Sind Sie dumm?" Nur für den Fall, dass die Antwort lautet

initial state

ist. Dann ist der nächste hier. (Ich werde den Import beim nächsten Mal weglassen.) Bitte erwarten Sie die Antwort, richtig?

var global string

func main(){
	global = "initial state"
	global ,err := double()
	if err != nil{}
	fmt.Println(global)
}

func double()(string,error){
	return "double",nil
}

Es ist immer noch einfach. Die Antwort ist

double

ist. Ist die "globale" Ausgabe hier wirklich eine global definierte "globale"? Übrigens gibt es eine global definierte "* sql.DB" als Beispiel dafür, wie man so schreibt. (Ich dachte, dass nur der undefinierte Fehler neu definiert wird, wenn ich ihn so schreibe.) Weiter ist das Hauptthema.

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"
}

Was denkst du, ist die Antwort "Fehler" oder "Doppel"? Die richtige Antwort ist

double

ist. Es scheint, dass "global" in "error ()" und "global", die ": =" in der Hauptfunktion verwendet haben, als unterschiedliche Variablen behandelt werden. Wenn dies passiert, gibt es eine Möglichkeit, innerhalb der Hauptfunktion auf das globale "globale" zu verweisen ...

Wann bist du in Schwierigkeiten?

Ich habe das Gefühl, in Schwierigkeiten zu sein, wenn ich mich in einer Situation wie diesem Quiz befinde, aber ich bin in einer sehr realistischen Situation. Siehe das folgende Beispiel. Definiert die Funktion setUp, um die im Test verwendete * sql.DB zu initialisieren. In diesem Fall wird ein neues "Db" jedoch nur in der "setUp" -Funktion definiert, die sich vom globalen "Db" unterscheidet, und das globale "Db" wird nicht aktualisiert.

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)
	}
}

Also muss ich so schreiben. (Ich weiß nicht, ob es die beste Vorgehensweise ist.)

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
}

Dies vermeidet das Problem der Neudefinition von "Db" in der Setup-Funktion und ermöglicht es Ihnen, während des gesamten Tests eine gemeinsame "Db" zu verwenden.

Zusammenfassung

Wenn Sie die Sprachspezifikationen nicht verstehen, werden Sie süchtig danach.

Recommended Posts

Eine Geschichte, die von Go's globalen Variablen und ihrem Umfang abhängig ist
Eine Geschichte über Python Pop und Append
Globale und lokale Variablen 2
Eine Geschichte über das Ändern von Python und das Hinzufügen von Funktionen
Globale und lokale Variablen 1
Eine Geschichte über Kindergärten, Kindergärten und Kindergärten
Informationen zu Python-Variablen und -Objekten
Eine erfrischende Geschichte über Slice in Python
Eine launische Geschichte über Slice in Python
Die Geschichte der Verwendung von Python reduziert
Eine Geschichte, die es aufgegeben hat, JavaScripthon unter Windows auszuführen.
Die Geschichte, einen süßen und schmerzhaften Blick auf benutzerdefinierte Benutzer auf Django zu werfen
Eine Geschichte über einen magischen Umbau, der Lubuntu in ein Chromebook bringt
Eine Geschichte, die Slack und Google Spreadsheet verbindet
Eine Geschichte über die Automatisierung von Online-Mahjong (Jakutama) mit OpenCV und maschinellem Lernen
Eine Geschichte über maschinelles Lernen mit Kyasuket
Die Geschichte, den Versuch aufzugeben, mit Heroku eine Verbindung zu MySQL herzustellen
Die Geschichte der Manipulation globaler Python-Variablen
Über _ und __
Eine Geschichte über einen Versuch, uwsgi auf einer fehlgeschlagenen EC2-Instanz zu installieren
Eine Geschichte über das Cross-Kompilieren eines Python-Pakets für AWS Lambda und das Bereitstellen ohne Server
Eine Geschichte über einfaches maschinelles Lernen mit TensorFlow
Eine Geschichte über den Betrieb einer GCP-Instanz von Discord
Die Geschichte, Artikel-verknüpfte Anzeigen auf Jubatus anzeigen zu wollen
Eine Geschichte über die Implementierung eines Anmeldebildschirms mit Django
Eine Geschichte über das Ausführen von Python auf PHP auf Heroku
Geschichte rund um die Datenanalyse durch maschinelles Lernen
Über den Umfang der Variablen. .. ..
Erste Schritte mit Python3 # 2 Erfahren Sie mehr über Typen und Variablen
Eine Geschichte, die Seaborn einfach, bequem und beeindruckt war
Geschichte der Verwendung von Resonas Software-Token mit 1Password
Eine Geschichte über die Vorhersage des Wechselkurses mit Deep Learning
Die Geschichte der Migration der gesamten Linux-Festplatte über SSH
Die Geschichte, mit Python eine Hanon-ähnliche Partitur zu machen
Eine Geschichte über das Ausprobieren eines (Golang +) Python-Monorepo mit Bazel
Eine Geschichte, die die Discord-Aktivität im Slack-Status widerspiegelt
Eine Geschichte über das Problem, 3 Millionen ID-Daten in einer Schleife zu verarbeiten
Die Geschichte, wie theano mit TSUBAME 2.0 verwaltet wurde
Eine Geschichte über die Änderung des Master-Namens von BlueZ
Eine Geschichte über einen Linux-Anfänger, der in einer Woche LPIC101 bestanden hat
Eine Geschichte über einen Linux-Anfänger, der Linux auf ein Windows-Tablet bringt
Eine Geschichte über das Stolpern durch PATH nach der Installation von Anaconda
[Python] Starten Sie eine Batchdatei aus Python und übergeben Sie Variablen.
(Hinweis) Eine Geschichte zum Erstellen eines Frage- und Antwortsystems mit Spring Boot und maschinellem Lernen (SVM).
Die Geschichte, einen PyPI-Cache-Server (mit Docker) aufzubauen und mich wieder ein wenig glücklich zu machen
(Erster Beitrag) Eine Geschichte über die numerische Berechnung von Influenza und neuem Lungenentzündungs-Coronavirus mit Tensorflow
Eine Geschichte über die Portierung des Codes "Versuchen Sie zu verstehen, wie Linux funktioniert" nach Rust