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.
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 ...
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.
Wenn Sie die Sprachspezifikationen nicht verstehen, werden Sie süchtig danach.
Recommended Posts