Wann wird die Funktion init () ausgeführt?


356

Ich habe versucht, eine genaue Erklärung zu finden, was die init()Funktion in Go tut. Ich habe gelesen, was Effective Go sagt, war mir aber nicht sicher, ob ich vollständig verstanden habe, was darin steht. Der genaue Satz, bei dem ich mir nicht sicher bin, lautet wie folgt:

Und schließlich heißt es endlich: init wird aufgerufen, nachdem alle Variablendeklarationen im Paket ihre Initialisierer ausgewertet haben, und diese werden erst ausgewertet, nachdem alle importierten Pakete initialisiert wurden.

Was heißt all the variable declarations in the package have evaluated their initializersdas Bedeutet dies, wenn Sie "globale" Variablen in einem Paket und seinen Dateien deklarieren, wird init () erst ausgeführt, wenn alles ausgewertet ist, und dann wird die gesamte init-Funktion und dann main () ausgeführt, wenn ./main_file_name ausgeführt wird?

Ich habe auch Mark Summerfields Go-Buch wie folgt gelesen:

Wenn ein Paket eine oder mehrere init () - Funktionen hat, werden diese automatisch ausgeführt, bevor die main () - Funktion des Hauptpakets aufgerufen wird.

init()Ist nach meinem Verständnis nur relevant, wenn Sie beabsichtigen, main () auszuführen, oder? oder das Hauptpaket. Jeder, der es genauer versteht, kann init()mich gerne korrigieren

Antworten:


435

Ja, vorausgesetzt, Sie haben Folgendes :

var WhatIsThe = AnswerToLife()

func AnswerToLife() int {
    return 42
}

func init() {
    WhatIsThe = 0
}

func main() {
    if WhatIsThe == 0 {
        fmt.Println("It's all a lie.")
    }
}

AnswerToLife()wird garantiert ausgeführt, bevor init()es aufgerufen wird, und init()wird garantiert ausgeführt, bevor es ausgeführt wirdmain() aufgerufen wird.

Denken Sie daran, dass dies init()immer aufgerufen wird, unabhängig davon, ob es main gibt oder nicht. Wenn Sie also ein Paket importieren, das eine initFunktion hat, wird es ausgeführt.

Darüber hinaus können Sie mehrere init()Funktionen pro Paket haben. Sie werden in der Reihenfolge ausgeführt, in der sie in der Datei angezeigt werden (nachdem natürlich alle Variablen initialisiert wurden). Wenn sie mehrere Dateien umfassen, werden sie in der Reihenfolge der lexikalischen Dateinamen ausgeführt (wie von @benc angegeben ):

Es scheint, dass init()Funktionen in der Reihenfolge der lexikalischen Dateinamen ausgeführt werden. In der Go-Spezifikation heißt es: "Build-Systeme werden aufgefordert, einem Compiler mehrere Dateien, die zu demselben Paket gehören, in lexikalischer Dateinamenreihenfolge zu präsentieren." Es scheint, dass das so go buildfunktioniert.


Viele der internen Go-Pakete werden init()zum Initialisieren von Tabellen und dergleichen verwendet, z. B. https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480


1
init()ist eine Sache pro Paket, denke ich ... initsBedeutet das also, dass, wenn verschiedene Dateien ihre eigenen haben , alle Intints immer direkt vor der Ausführung von main () ausgeführt werden? Können Sie mir auch eines klarstellen, warum Sie ein init () ohne main haben und wie funktioniert das? Bedeutet dies, dass init () das letzte ist, was ausgeführt wird, bevor das Paket importiert wird? Andernfalls wird das Programm niemals ausgeführt, wenn es nicht importiert wird und kein Hauptprogramm vorhanden ist ... richtig? (es sei denn, es ist eine Testdatei, denke ich ...)
Pinocchio

4
Es gibt viele Gründe, init ohne das Paket auszuführen main, beispielsweise wenn Sie mehrere Variablen initialisieren oder einige Dateien laden oder einmalige Berechnungen durchführen müssen. Wenn Ihr gesamtes Programm ein Paket ist, das nicht wirklich benötigt wird. Wenn es sich jedoch um mehrere Pakete handelt, müssen einige von ihnen möglicherweise eine spezifische Initialisierung durchführen.
OneOfOne

4
@Pinocchio Es gibt immer eine (und nur eine) main (), wenn Sie ein go-Programm ausführen. Und init () -Funktionen werden vor diesem einen main () ausgeführt. Allerdings benötigen nicht alle Pakete ein main (). Wenn Sie beispielsweise ein wiederverwendbares Paket mit Dienstprogrammfunktionen zum Herstellen einer Verbindung zu einer Datenbank erstellen, sollte dieses Paket kein main () haben. Aber es könnte ein init () haben. Wenn Sie dieses Datenbankpaket in einem Programm verwenden, hat das Programm jedoch ein main ().
Nr.

Ein gutes Beispiel dafür initist eine steckbare Architektur wie bei Cobra Commander . Beachten Sie, wie initin den Beispielen verwiesen wird
Dan Esparza

1
@OneOfOne Nach einigen Tests scheint es, dass init () -Funktionen in der Reihenfolge der lexikalischen Dateinamen ausgeführt werden. In der Go-Spezifikation heißt es: "Build-Systeme werden aufgefordert, einem Compiler mehrere Dateien, die zum selben Paket gehören, in lexikalischer Dateinamenreihenfolge zu präsentieren." Es scheint, dass go build so funktioniert.
Bank

222

Siehe dieses Bild. :) :)

import --> const --> var --> init()

  1. Wenn ein Paket andere Pakete importiert, werden die importierten Pakete zuerst initialisiert.

  2. Die Konstante des aktuellen Pakets wird dann initialisiert.

  3. Die Variablen des aktuellen Pakets werden dann initialisiert.

  4. Schließlich wird die init()Funktion des aktuellen Pakets aufgerufen.

Ein Paket kann mehrere Init-Funktionen haben (entweder in einer einzelnen Datei oder über mehrere Dateien verteilt) und sie werden in der Reihenfolge aufgerufen, in der sie dem Compiler präsentiert werden.


Ein Paket wird nur einmal initialisiert, selbst wenn es aus mehreren Paketen importiert wird.


3
Danke dafür. Das Hinzufügen von Text ist in diesem Diagramm sinnvoll.
Balaji Boggaram Ramanarayan

1
Ich bin mir nicht sicher, ob wir dann sagen können, dass Konstanten initialisiert werden. Es wird erwartet, dass sie zur Kompilierungszeit bekannt sind, oder?
Alexis Wilke

Vielen Dank dafür. Dieses Bild hat mir bei der Lösung eines großen Build-Problems geholfen. Kann ich jedoch fragen, woher dieses Bild stammt?
Korede Lawrence Oluwafemi

1
@KoredeLawrenceOluwafemi Ansicht der Bild - Link finden Sie , dass es von einem ist Buch von einem chinesischen Go Prediger geschrieben github.com/astaxie
weaming

26

Etwas hinzuzufügen (was ich als Kommentar hinzugefügt hätte, aber zum Zeitpunkt des Schreibens dieses Beitrags hatte ich noch nicht genug Ruf)

Da ich mehrere Inits im selben Paket habe, habe ich noch keinen garantierten Weg gefunden, um zu wissen, in welcher Reihenfolge sie ausgeführt werden. Zum Beispiel habe ich:

package config
    - config.go
    - router.go

Beide config.gound router.goenthalten init()Funktionen, aber beim Ausführen wurde router.godie Funktion zuerst ausgeführt (was meine App in Panik versetzte).

Wenn Sie sich in einer Situation befinden, in der Sie mehrere Dateien haben, ist sich jede init()bewusst, dass Sie nicht garantiert eine vor der anderen erhalten. Es ist besser, eine Variablenzuweisung zu verwenden, wie OneToOne in seinem Beispiel zeigt. Das Beste daran ist: Diese Variablendeklaration erfolgt vor ALLEN init()Funktionen im Paket.

Zum Beispiel

config.go:

var ConfigSuccess = configureApplication()

func init() {
    doSomething()
}

func configureApplication() bool {
    l4g.Info("Configuring application...")
    if valid := loadCommandLineFlags(); !valid {
        l4g.Critical("Failed to load Command Line Flags")
        return false
    }
    return true
}

router.go:

func init() {
    var (
        rwd string
        tmp string
        ok  bool
    )
    if metapath, ok := Config["fs"]["metapath"].(string); ok {
        var err error
        Conn, err = services.NewConnection(metapath + "/metadata.db")
        if err != nil {
            panic(err)
        }
    }
}

Unabhängig davon, ob var ConfigSuccess = configureApplication()in router.gooder vorhanden ist config.go, wird es ausgeführt, bevor EITHER ausgeführt init()wird.


3
Nur meine zwei Cent: Sie könnten "einfache Init" von komplexer (panikauslösender) Initialisierung trennen. Wenn Sie bei init () in Panik geraten, geben Sie dem Hauptprogramm keine Chance. Vielleicht ein func initialize|loadConfig|connectgetrennter func init, func init () für grundlegende Dinge (ohne Panik). Diese Trennung beseitigt auch die Notwendigkeit des Hacks, um die Init-Reihenfolge sicherzustellen. Ich hoffe, hilfreich zu sein.
Lucio M. Tato

3
Zitat aus der Sprachspezifikation: Ein Paket ohne Importe wird initialisiert, indem allen Variablen auf Paketebene Anfangswerte zugewiesen werden und anschließend alle Init-Funktionen in der Reihenfolge aufgerufen werden, in der sie in der Quelle angezeigt werden, möglicherweise in mehreren Dateien, wie sie dem Compiler angezeigt werden. Um ein reproduzierbares Initialisierungsverhalten sicherzustellen, wird Build-Systemen empfohlen, einem Compiler mehrere Dateien, die zum selben Paket gehören, in lexikalischer Dateinamenreihenfolge zu präsentieren.
updogliu

1
Das Unglückliche, auf das ich in meiner Anwendung gestoßen bin, war, dass die Init-Funktionen nicht in lexikalischer Reihenfolge ausgeführt wurden. Möglicherweise handelt es sich um einen Compiler-Fehler, der inzwischen behoben wurde. Ich habe mich nicht darum gekümmert, zu überprüfen, ob diesbezüglich irgendwelche Probleme aufgetreten sind.
Rifflock

1
Wichtiger Kommentar von updogliu oben. Dies scheint bei Importen nicht zuzutreffen. Ich stoße hier auf einen Fall, in dem ich einen Test habe, der auf mehreren importierten Paketen beruht. Und der Trick, die Variablen auf Paketebene zu verwenden, hilft mir nicht zu verhindern, dass init () -Methoden für abhängige Pakete ausgeführt werden, bevor meine Variable eine Funktion zugewiesen hat.
Uncrase

1
Die Reihenfolge der init()Aufrufe innerhalb eines einzelnen Pakets hängt davon ab, wie sie in den Compiler eingespeist werden. Das goTool ordnet die Dateien alphabetisch. Von da an werden sie innerhalb einer einzelnen Datei in syntaktischer Reihenfolge initialisiert. bearbeitet für Wortwahl
adityajones

8

Hier ist ein weiteres Beispiel - https://github.com/alok87/gobyexample/blob/master/init/init.go

package main

import (
    "fmt"
)

func callOut() int {
    fmt.Println("Outside is beinge executed")
    return 1
}

var test = callOut()

func init() {
    fmt.Println("Init3 is being executed")
}

func init() {
    fmt.Println("Init is being executed")
}

func init() {
    fmt.Println("Init2 is being executed")
}

func main() {
    fmt.Println("Do your thing !")
}

Ausgabe des obigen Programms

$ go run init/init.go
Outside is being executed
Init3 is being executed
Init is being executed
Init2 is being executed
Do your thing !

4

Nehmen Sie zum Beispiel ein Framework oder eine Bibliothek, die Sie für andere Benutzer entwerfen. Diese Benutzer haben schließlich eine main functionin ihrem Code, um ihre App auszuführen. Wenn der Benutzer direkt ein Unterpaket des Projekts Ihrer Bibliothek importiert init, wird das dieses Unterpakets zunächst ( einmal ) aufgerufen . Gleiches gilt für das Root-Paket der Bibliothek usw.

Es gibt viele Fälle, in denen Sie möchten, dass ein Codeblockmain func direkt oder ohne das Vorhandensein von a ausgeführt wird.

Wenn Sie als Entwickler der imaginären Bibliothek das Unterpaket Ihrer Bibliothek importieren, das eine initFunktion hat, wird es zuerst aufgerufen, und einmal haben Sie keine, main funcaber Sie müssen sicherstellen, dass einige Variablen oder eine Tabelle wird vor den Aufrufen anderer Funktionen initialisiert.

Eine gute Sache zu erinnern und nicht zu befürchten ist , dass: die initimmer ausführen einmal pro Anwendung.

init Ausführung geschieht:

  1. direkt vor der initFunktion des "Anrufer" -Pakets,
  2. vor dem, optional main func,
  3. aber nach den Paket-Level - Variablen var = [...] or cost = [...],

Wenn Sie ein Paket importieren, werden alle Init-Funktionen in der angegebenen Reihenfolge ausgeführt .

Ich werde ein sehr gutes Beispiel für eine Init-Funktion geben. Es werden Mime-Typen zu einer Standard-Go-Bibliothek mit dem Namen hinzugefügt, mimeund eine Funktion auf Paketebene verwendet das mimeStandardpaket direkt, um die benutzerdefinierten Mime-Typen abzurufen, die bereits bei ihrer initFunktion initialisiert wurden :

package mime

import (
    "mime"
    "path/filepath"
)

var types = map[string]string{
    ".3dm":       "x-world/x-3dmf",
    ".3dmf":      "x-world/x-3dmf",
    ".7z":        "application/x-7z-compressed",
    ".a":         "application/octet-stream",
    ".aab":       "application/x-authorware-bin",
    ".aam":       "application/x-authorware-map",
    ".aas":       "application/x-authorware-seg",
    ".abc":       "text/vndabc",
    ".ace":       "application/x-ace-compressed",
    ".acgi":      "text/html",
    ".afl":       "video/animaflex",
    ".ai":        "application/postscript",
    ".aif":       "audio/aiff",
    ".aifc":      "audio/aiff",
    ".aiff":      "audio/aiff",
    ".aim":       "application/x-aim",
    ".aip":       "text/x-audiosoft-intra",
    ".alz":       "application/x-alz-compressed",
    ".ani":       "application/x-navi-animation",
    ".aos":       "application/x-nokia-9000-communicator-add-on-software",
    ".aps":       "application/mime",
    ".apk":       "application/vnd.android.package-archive",
    ".arc":       "application/x-arc-compressed",
    ".arj":       "application/arj",
    ".art":       "image/x-jg",
    ".asf":       "video/x-ms-asf",
    ".asm":       "text/x-asm",
    ".asp":       "text/asp",
    ".asx":       "application/x-mplayer2",
    ".au":        "audio/basic",
    ".avi":       "video/x-msvideo",
    ".avs":       "video/avs-video",
    ".bcpio":     "application/x-bcpio",
    ".bin":       "application/mac-binary",
    ".bmp":       "image/bmp",
    ".boo":       "application/book",
    ".book":      "application/book",
    ".boz":       "application/x-bzip2",
    ".bsh":       "application/x-bsh",
    ".bz2":       "application/x-bzip2",
    ".bz":        "application/x-bzip",
    ".c++":       "text/plain",
    ".c":         "text/x-c",
    ".cab":       "application/vnd.ms-cab-compressed",
    ".cat":       "application/vndms-pkiseccat",
    ".cc":        "text/x-c",
    ".ccad":      "application/clariscad",
    ".cco":       "application/x-cocoa",
    ".cdf":       "application/cdf",
    ".cer":       "application/pkix-cert",
    ".cha":       "application/x-chat",
    ".chat":      "application/x-chat",
    ".chrt":      "application/vnd.kde.kchart",
    ".class":     "application/java",
    ".com":       "text/plain",
    ".conf":      "text/plain",
    ".cpio":      "application/x-cpio",
    ".cpp":       "text/x-c",
    ".cpt":       "application/mac-compactpro",
    ".crl":       "application/pkcs-crl",
    ".crt":       "application/pkix-cert",
    ".crx":       "application/x-chrome-extension",
    ".csh":       "text/x-scriptcsh",
    ".css":       "text/css",
    ".csv":       "text/csv",
    ".cxx":       "text/plain",
    ".dar":       "application/x-dar",
    ".dcr":       "application/x-director",
    ".deb":       "application/x-debian-package",
    ".deepv":     "application/x-deepv",
    ".def":       "text/plain",
    ".der":       "application/x-x509-ca-cert",
    ".dif":       "video/x-dv",
    ".dir":       "application/x-director",
    ".divx":      "video/divx",
    ".dl":        "video/dl",
    ".dmg":       "application/x-apple-diskimage",
    ".doc":       "application/msword",
    ".dot":       "application/msword",
    ".dp":        "application/commonground",
    ".drw":       "application/drafting",
    ".dump":      "application/octet-stream",
    ".dv":        "video/x-dv",
    ".dvi":       "application/x-dvi",
    ".dwf":       "drawing/x-dwf=(old)",
    ".dwg":       "application/acad",
    ".dxf":       "application/dxf",
    ".dxr":       "application/x-director",
    ".el":        "text/x-scriptelisp",
    ".elc":       "application/x-bytecodeelisp=(compiled=elisp)",
    ".eml":       "message/rfc822",
    ".env":       "application/x-envoy",
    ".eps":       "application/postscript",
    ".es":        "application/x-esrehber",
    ".etx":       "text/x-setext",
    ".evy":       "application/envoy",
    ".exe":       "application/octet-stream",
    ".f77":       "text/x-fortran",
    ".f90":       "text/x-fortran",
    ".f":         "text/x-fortran",
    ".fdf":       "application/vndfdf",
    ".fif":       "application/fractals",
    ".fli":       "video/fli",
    ".flo":       "image/florian",
    ".flv":       "video/x-flv",
    ".flx":       "text/vndfmiflexstor",
    ".fmf":       "video/x-atomic3d-feature",
    ".for":       "text/x-fortran",
    ".fpx":       "image/vndfpx",
    ".frl":       "application/freeloader",
    ".funk":      "audio/make",
    ".g3":        "image/g3fax",
    ".g":         "text/plain",
    ".gif":       "image/gif",
    ".gl":        "video/gl",
    ".gsd":       "audio/x-gsm",
    ".gsm":       "audio/x-gsm",
    ".gsp":       "application/x-gsp",
    ".gss":       "application/x-gss",
    ".gtar":      "application/x-gtar",
    ".gz":        "application/x-compressed",
    ".gzip":      "application/x-gzip",
    ".h":         "text/x-h",
    ".hdf":       "application/x-hdf",
    ".help":      "application/x-helpfile",
    ".hgl":       "application/vndhp-hpgl",
    ".hh":        "text/x-h",
    ".hlb":       "text/x-script",
    ".hlp":       "application/hlp",
    ".hpg":       "application/vndhp-hpgl",
    ".hpgl":      "application/vndhp-hpgl",
    ".hqx":       "application/binhex",
    ".hta":       "application/hta",
    ".htc":       "text/x-component",
    ".htm":       "text/html",
    ".html":      "text/html",
    ".htmls":     "text/html",
    ".htt":       "text/webviewhtml",
    ".htx":       "text/html",
    ".ice":       "x-conference/x-cooltalk",
    ".ico":       "image/x-icon",
    ".ics":       "text/calendar",
    ".icz":       "text/calendar",
    ".idc":       "text/plain",
    ".ief":       "image/ief",
    ".iefs":      "image/ief",
    ".iges":      "application/iges",
    ".igs":       "application/iges",
    ".ima":       "application/x-ima",
    ".imap":      "application/x-httpd-imap",
    ".inf":       "application/inf",
    ".ins":       "application/x-internett-signup",
    ".ip":        "application/x-ip2",
    ".isu":       "video/x-isvideo",
    ".it":        "audio/it",
    ".iv":        "application/x-inventor",
    ".ivr":       "i-world/i-vrml",
    ".ivy":       "application/x-livescreen",
    ".jam":       "audio/x-jam",
    ".jav":       "text/x-java-source",
    ".java":      "text/x-java-source",
    ".jcm":       "application/x-java-commerce",
    ".jfif-tbnl": "image/jpeg",
    ".jfif":      "image/jpeg",
    ".jnlp":      "application/x-java-jnlp-file",
    ".jpe":       "image/jpeg",
    ".jpeg":      "image/jpeg",
    ".jpg":       "image/jpeg",
    ".jps":       "image/x-jps",
    ".js":        "application/javascript",
    ".json":      "application/json",
    ".jut":       "image/jutvision",
    ".kar":       "audio/midi",
    ".karbon":    "application/vnd.kde.karbon",
    ".kfo":       "application/vnd.kde.kformula",
    ".flw":       "application/vnd.kde.kivio",
    ".kml":       "application/vnd.google-earth.kml+xml",
    ".kmz":       "application/vnd.google-earth.kmz",
    ".kon":       "application/vnd.kde.kontour",
    ".kpr":       "application/vnd.kde.kpresenter",
    ".kpt":       "application/vnd.kde.kpresenter",
    ".ksp":       "application/vnd.kde.kspread",
    ".kwd":       "application/vnd.kde.kword",
    ".kwt":       "application/vnd.kde.kword",
    ".ksh":       "text/x-scriptksh",
    ".la":        "audio/nspaudio",
    ".lam":       "audio/x-liveaudio",
    ".latex":     "application/x-latex",
    ".lha":       "application/lha",
    ".lhx":       "application/octet-stream",
    ".list":      "text/plain",
    ".lma":       "audio/nspaudio",
    ".log":       "text/plain",
    ".lsp":       "text/x-scriptlisp",
    ".lst":       "text/plain",
    ".lsx":       "text/x-la-asf",
    ".ltx":       "application/x-latex",
    ".lzh":       "application/octet-stream",
    ".lzx":       "application/lzx",
    ".m1v":       "video/mpeg",
    ".m2a":       "audio/mpeg",
    ".m2v":       "video/mpeg",
    ".m3u":       "audio/x-mpegurl",
    ".m":         "text/x-m",
    ".man":       "application/x-troff-man",
    ".manifest":  "text/cache-manifest",
    ".map":       "application/x-navimap",
    ".mar":       "text/plain",
    ".mbd":       "application/mbedlet",
    ".mc$":       "application/x-magic-cap-package-10",
    ".mcd":       "application/mcad",
    ".mcf":       "text/mcf",
    ".mcp":       "application/netmc",
    ".me":        "application/x-troff-me",
    ".mht":       "message/rfc822",
    ".mhtml":     "message/rfc822",
    ".mid":       "application/x-midi",
    ".midi":      "application/x-midi",
    ".mif":       "application/x-frame",
    ".mime":      "message/rfc822",
    ".mjf":       "audio/x-vndaudioexplosionmjuicemediafile",
    ".mjpg":      "video/x-motion-jpeg",
    ".mm":        "application/base64",
    ".mme":       "application/base64",
    ".mod":       "audio/mod",
    ".moov":      "video/quicktime",
    ".mov":       "video/quicktime",
    ".movie":     "video/x-sgi-movie",
    ".mp2":       "audio/mpeg",
    ".mp3":       "audio/mpeg3",
    ".mp4":       "video/mp4",
    ".mpa":       "audio/mpeg",
    ".mpc":       "application/x-project",
    ".mpe":       "video/mpeg",
    ".mpeg":      "video/mpeg",
    ".mpg":       "video/mpeg",
    ".mpga":      "audio/mpeg",
    ".mpp":       "application/vndms-project",
    ".mpt":       "application/x-project",
    ".mpv":       "application/x-project",
    ".mpx":       "application/x-project",
    ".mrc":       "application/marc",
    ".ms":        "application/x-troff-ms",
    ".mv":        "video/x-sgi-movie",
    ".my":        "audio/make",
    ".mzz":       "application/x-vndaudioexplosionmzz",
    ".nap":       "image/naplps",
    ".naplps":    "image/naplps",
    ".nc":        "application/x-netcdf",
    ".ncm":       "application/vndnokiaconfiguration-message",
    ".nif":       "image/x-niff",
    ".niff":      "image/x-niff",
    ".nix":       "application/x-mix-transfer",
    ".nsc":       "application/x-conference",
    ".nvd":       "application/x-navidoc",
    ".o":         "application/octet-stream",
    ".oda":       "application/oda",
    ".odb":       "application/vnd.oasis.opendocument.database",
    ".odc":       "application/vnd.oasis.opendocument.chart",
    ".odf":       "application/vnd.oasis.opendocument.formula",
    ".odg":       "application/vnd.oasis.opendocument.graphics",
    ".odi":       "application/vnd.oasis.opendocument.image",
    ".odm":       "application/vnd.oasis.opendocument.text-master",
    ".odp":       "application/vnd.oasis.opendocument.presentation",
    ".ods":       "application/vnd.oasis.opendocument.spreadsheet",
    ".odt":       "application/vnd.oasis.opendocument.text",
    ".oga":       "audio/ogg",
    ".ogg":       "audio/ogg",
    ".ogv":       "video/ogg",
    ".omc":       "application/x-omc",
    ".omcd":      "application/x-omcdatamaker",
    ".omcr":      "application/x-omcregerator",
    ".otc":       "application/vnd.oasis.opendocument.chart-template",
    ".otf":       "application/vnd.oasis.opendocument.formula-template",
    ".otg":       "application/vnd.oasis.opendocument.graphics-template",
    ".oth":       "application/vnd.oasis.opendocument.text-web",
    ".oti":       "application/vnd.oasis.opendocument.image-template",
    ".otm":       "application/vnd.oasis.opendocument.text-master",
    ".otp":       "application/vnd.oasis.opendocument.presentation-template",
    ".ots":       "application/vnd.oasis.opendocument.spreadsheet-template",
    ".ott":       "application/vnd.oasis.opendocument.text-template",
    ".p10":       "application/pkcs10",
    ".p12":       "application/pkcs-12",
    ".p7a":       "application/x-pkcs7-signature",
    ".p7c":       "application/pkcs7-mime",
    ".p7m":       "application/pkcs7-mime",
    ".p7r":       "application/x-pkcs7-certreqresp",
    ".p7s":       "application/pkcs7-signature",
    ".p":         "text/x-pascal",
    ".part":      "application/pro_eng",
    ".pas":       "text/pascal",
    ".pbm":       "image/x-portable-bitmap",
    ".pcl":       "application/vndhp-pcl",
    ".pct":       "image/x-pict",
    ".pcx":       "image/x-pcx",
    ".pdb":       "chemical/x-pdb",
    ".pdf":       "application/pdf",
    ".pfunk":     "audio/make",
    ".pgm":       "image/x-portable-graymap",
    ".pic":       "image/pict",
    ".pict":      "image/pict",
    ".pkg":       "application/x-newton-compatible-pkg",
    ".pko":       "application/vndms-pkipko",
    ".pl":        "text/x-scriptperl",
    ".plx":       "application/x-pixclscript",
    ".pm4":       "application/x-pagemaker",
    ".pm5":       "application/x-pagemaker",
    ".pm":        "text/x-scriptperl-module",
    ".png":       "image/png",
    ".pnm":       "application/x-portable-anymap",
    ".pot":       "application/mspowerpoint",
    ".pov":       "model/x-pov",
    ".ppa":       "application/vndms-powerpoint",
    ".ppm":       "image/x-portable-pixmap",
    ".pps":       "application/mspowerpoint",
    ".ppt":       "application/mspowerpoint",
    ".ppz":       "application/mspowerpoint",
    ".pre":       "application/x-freelance",
    ".prt":       "application/pro_eng",
    ".ps":        "application/postscript",
    ".psd":       "application/octet-stream",
    ".pvu":       "paleovu/x-pv",
    ".pwz":       "application/vndms-powerpoint",
    ".py":        "text/x-scriptphyton",
    ".pyc":       "application/x-bytecodepython",
    ".qcp":       "audio/vndqcelp",
    ".qd3":       "x-world/x-3dmf",
    ".qd3d":      "x-world/x-3dmf",
    ".qif":       "image/x-quicktime",
    ".qt":        "video/quicktime",
    ".qtc":       "video/x-qtc",
    ".qti":       "image/x-quicktime",
    ".qtif":      "image/x-quicktime",
    ".ra":        "audio/x-pn-realaudio",
    ".ram":       "audio/x-pn-realaudio",
    ".rar":       "application/x-rar-compressed",
    ".ras":       "application/x-cmu-raster",
    ".rast":      "image/cmu-raster",
    ".rexx":      "text/x-scriptrexx",
    ".rf":        "image/vndrn-realflash",
    ".rgb":       "image/x-rgb",
    ".rm":        "application/vndrn-realmedia",
    ".rmi":       "audio/mid",
    ".rmm":       "audio/x-pn-realaudio",
    ".rmp":       "audio/x-pn-realaudio",
    ".rng":       "application/ringing-tones",
    ".rnx":       "application/vndrn-realplayer",
    ".roff":      "application/x-troff",
    ".rp":        "image/vndrn-realpix",
    ".rpm":       "audio/x-pn-realaudio-plugin",
    ".rt":        "text/vndrn-realtext",
    ".rtf":       "text/richtext",
    ".rtx":       "text/richtext",
    ".rv":        "video/vndrn-realvideo",
    ".s":         "text/x-asm",
    ".s3m":       "audio/s3m",
    ".s7z":       "application/x-7z-compressed",
    ".saveme":    "application/octet-stream",
    ".sbk":       "application/x-tbook",
    ".scm":       "text/x-scriptscheme",
    ".sdml":      "text/plain",
    ".sdp":       "application/sdp",
    ".sdr":       "application/sounder",
    ".sea":       "application/sea",
    ".set":       "application/set",
    ".sgm":       "text/x-sgml",
    ".sgml":      "text/x-sgml",
    ".sh":        "text/x-scriptsh",
    ".shar":      "application/x-bsh",
    ".shtml":     "text/x-server-parsed-html",
    ".sid":       "audio/x-psid",
    ".skd":       "application/x-koan",
    ".skm":       "application/x-koan",
    ".skp":       "application/x-koan",
    ".skt":       "application/x-koan",
    ".sit":       "application/x-stuffit",
    ".sitx":      "application/x-stuffitx",
    ".sl":        "application/x-seelogo",
    ".smi":       "application/smil",
    ".smil":      "application/smil",
    ".snd":       "audio/basic",
    ".sol":       "application/solids",
    ".spc":       "text/x-speech",
    ".spl":       "application/futuresplash",
    ".spr":       "application/x-sprite",
    ".sprite":    "application/x-sprite",
    ".spx":       "audio/ogg",
    ".src":       "application/x-wais-source",
    ".ssi":       "text/x-server-parsed-html",
    ".ssm":       "application/streamingmedia",
    ".sst":       "application/vndms-pkicertstore",
    ".step":      "application/step",
    ".stl":       "application/sla",
    ".stp":       "application/step",
    ".sv4cpio":   "application/x-sv4cpio",
    ".sv4crc":    "application/x-sv4crc",
    ".svf":       "image/vnddwg",
    ".svg":       "image/svg+xml",
    ".svr":       "application/x-world",
    ".swf":       "application/x-shockwave-flash",
    ".t":         "application/x-troff",
    ".talk":      "text/x-speech",
    ".tar":       "application/x-tar",
    ".tbk":       "application/toolbook",
    ".tcl":       "text/x-scripttcl",
    ".tcsh":      "text/x-scripttcsh",
    ".tex":       "application/x-tex",
    ".texi":      "application/x-texinfo",
    ".texinfo":   "application/x-texinfo",
    ".text":      "text/plain",
    ".tgz":       "application/gnutar",
    ".tif":       "image/tiff",
    ".tiff":      "image/tiff",
    ".tr":        "application/x-troff",
    ".tsi":       "audio/tsp-audio",
    ".tsp":       "application/dsptype",
    ".tsv":       "text/tab-separated-values",
    ".turbot":    "image/florian",
    ".txt":       "text/plain",
    ".uil":       "text/x-uil",
    ".uni":       "text/uri-list",
    ".unis":      "text/uri-list",
    ".unv":       "application/i-deas",
    ".uri":       "text/uri-list",
    ".uris":      "text/uri-list",
    ".ustar":     "application/x-ustar",
    ".uu":        "text/x-uuencode",
    ".uue":       "text/x-uuencode",
    ".vcd":       "application/x-cdlink",
    ".vcf":       "text/x-vcard",
    ".vcard":     "text/x-vcard",
    ".vcs":       "text/x-vcalendar",
    ".vda":       "application/vda",
    ".vdo":       "video/vdo",
    ".vew":       "application/groupwise",
    ".viv":       "video/vivo",
    ".vivo":      "video/vivo",
    ".vmd":       "application/vocaltec-media-desc",
    ".vmf":       "application/vocaltec-media-file",
    ".voc":       "audio/voc",
    ".vos":       "video/vosaic",
    ".vox":       "audio/voxware",
    ".vqe":       "audio/x-twinvq-plugin",
    ".vqf":       "audio/x-twinvq",
    ".vql":       "audio/x-twinvq-plugin",
    ".vrml":      "application/x-vrml",
    ".vrt":       "x-world/x-vrt",
    ".vsd":       "application/x-visio",
    ".vst":       "application/x-visio",
    ".vsw":       "application/x-visio",
    ".w60":       "application/wordperfect60",
    ".w61":       "application/wordperfect61",
    ".w6w":       "application/msword",
    ".wav":       "audio/wav",
    ".wb1":       "application/x-qpro",
    ".wbmp":      "image/vnd.wap.wbmp",
    ".web":       "application/vndxara",
    ".wiz":       "application/msword",
    ".wk1":       "application/x-123",
    ".wmf":       "windows/metafile",
    ".wml":       "text/vnd.wap.wml",
    ".wmlc":      "application/vnd.wap.wmlc",
    ".wmls":      "text/vnd.wap.wmlscript",
    ".wmlsc":     "application/vnd.wap.wmlscriptc",
    ".word":      "application/msword",
    ".wp5":       "application/wordperfect",
    ".wp6":       "application/wordperfect",
    ".wp":        "application/wordperfect",
    ".wpd":       "application/wordperfect",
    ".wq1":       "application/x-lotus",
    ".wri":       "application/mswrite",
    ".wrl":       "application/x-world",
    ".wrz":       "model/vrml",
    ".wsc":       "text/scriplet",
    ".wsrc":      "application/x-wais-source",
    ".wtk":       "application/x-wintalk",
    ".x-png":     "image/png",
    ".xbm":       "image/x-xbitmap",
    ".xdr":       "video/x-amt-demorun",
    ".xgz":       "xgl/drawing",
    ".xif":       "image/vndxiff",
    ".xl":        "application/excel",
    ".xla":       "application/excel",
    ".xlb":       "application/excel",
    ".xlc":       "application/excel",
    ".xld":       "application/excel",
    ".xlk":       "application/excel",
    ".xll":       "application/excel",
    ".xlm":       "application/excel",
    ".xls":       "application/excel",
    ".xlt":       "application/excel",
    ".xlv":       "application/excel",
    ".xlw":       "application/excel",
    ".xm":        "audio/xm",
    ".xml":       "text/xml",
    ".xmz":       "xgl/movie",
    ".xpix":      "application/x-vndls-xpix",
    ".xpm":       "image/x-xpixmap",
    ".xsr":       "video/x-amt-showrun",
    ".xwd":       "image/x-xwd",
    ".xyz":       "chemical/x-pdb",
    ".z":         "application/x-compress",
    ".zip":       "application/zip",
    ".zoo":       "application/octet-stream",
    ".zsh":       "text/x-scriptzsh",
    ".docx":      "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
    ".docm":      "application/vnd.ms-word.document.macroEnabled.12",
    ".dotx":      "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
    ".dotm":      "application/vnd.ms-word.template.macroEnabled.12",
    ".xlsx":      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    ".xlsm":      "application/vnd.ms-excel.sheet.macroEnabled.12",
    ".xltx":      "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
    ".xltm":      "application/vnd.ms-excel.template.macroEnabled.12",
    ".xlsb":      "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
    ".xlam":      "application/vnd.ms-excel.addin.macroEnabled.12",
    ".pptx":      "application/vnd.openxmlformats-officedocument.presentationml.presentation",
    ".pptm":      "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
    ".ppsx":      "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
    ".ppsm":      "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
    ".potx":      "application/vnd.openxmlformats-officedocument.presentationml.template",
    ".potm":      "application/vnd.ms-powerpoint.template.macroEnabled.12",
    ".ppam":      "application/vnd.ms-powerpoint.addin.macroEnabled.12",
    ".sldx":      "application/vnd.openxmlformats-officedocument.presentationml.slide",
    ".sldm":      "application/vnd.ms-powerpoint.slide.macroEnabled.12",
    ".thmx":      "application/vnd.ms-officetheme",
    ".onetoc":    "application/onenote",
    ".onetoc2":   "application/onenote",
    ".onetmp":    "application/onenote",
    ".onepkg":    "application/onenote",
    ".xpi":       "application/x-xpinstall",
}

func init() {
    for ext, typ := range types {
        // skip errors
        mime.AddExtensionType(ext, typ)
    }
}

// typeByExtension returns the MIME type associated with the file extension ext.
// The extension ext should begin with a leading dot, as in ".html".
// When ext has no associated type, typeByExtension returns "".
//
// Extensions are looked up first case-sensitively, then case-insensitively.
//
// The built-in table is small but on unix it is augmented by the local
// system's mime.types file(s) if available under one or more of these
// names:
//
//   /etc/mime.types
//   /etc/apache2/mime.types
//   /etc/apache/mime.types
//
// On Windows, MIME types are extracted from the registry.
//
// Text types have the charset parameter set to "utf-8" by default.
func TypeByExtension(fullfilename string) string {
    ext := filepath.Ext(fullfilename)
    typ := mime.TypeByExtension(ext)

    // mime.TypeByExtension returns as text/plain; | charset=utf-8 the static .js (not always)
    if ext == ".js" && (typ == "text/plain" || typ == "text/plain; charset=utf-8") {

        if ext == ".js" {
            typ = "application/javascript"
        }
    }
    return typ
}

Ich hoffe, das hat Ihnen und anderen Benutzern geholfen. Zögern Sie nicht, erneut zu posten, wenn Sie weitere Fragen haben!


2

https://golang.org/ref/mem#tmp_4

Die Programminitialisierung wird in einer einzelnen Goroutine ausgeführt, aber diese Goroutine kann andere Goroutinen erstellen, die gleichzeitig ausgeführt werden.

Wenn ein Paket p das Paket q importiert, erfolgt der Abschluss der Init-Funktionen von q vor dem Start eines der Ps.

Der Start der Funktion main.main erfolgt nach Abschluss aller Init-Funktionen.


1

init wird überall aufgerufen, verwendet sein Paket (egal Blankimport oder Import), aber nur einmal.

Dies ist ein Paket:

package demo

import (
    "some/logs"
)

var count int

func init() {
    logs.Debug(count)
}

// Do do
func Do() {
    logs.Debug("dd")
}

Jedes Paket (Hauptpaket oder Testpaket) importiert es als leer:

_ "printfcoder.com/we/models/demo"

oder importiere es mit func:

"printfcoder.com/we/models/demo"

func someFunc(){
   demo.Do()
}

Der Init wird 0nur einmal protokolliert . Beim ersten Paket, das es verwendet, wird seine Init-Funktion vor dem Init des Pakets ausgeführt. Damit:

A ruft B an, B ruft C an, alle haben Init-Funktion, das Init des C wird zuerst vor dem B ausgeführt, das B vor dem A.


1

mutil init Funktion in einem Paket Ausführungsreihenfolge:

  1. const und variable definierte Datei init () Funktion ausführen

  2. init Funktion Ausführungsreihenfolge mit dem Dateinamen asc


0

Die Init-Funktion läuft zuerst und dann main. Es wird verwendet, um zuerst etwas festzulegen, bevor Ihr Programm ausgeführt wird, zum Beispiel:

Zugriff auf eine Vorlage, Ausführen des Programms mit allen Kernen, Überprüfen der Gänse und des Bogens usw.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.