When is the init() function run?

前端 未结 11 664
离开以前
离开以前 2020-12-02 03:41

I\'ve tried to find a precise explanation of what the init() function does in Go. I read what Effective Go says but I was unsure if I understood fully what it s

相关标签:
11条回答
  • 2020-12-02 03:52

    Here is another example - https://play.golang.org/p/9P-LmSkUMKY

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

    Output of the above program

    $ go run init/init.go
    Outside is being executed
    Init3 is being executed
    Init is being executed
    Init2 is being executed
    Do your thing !
    
    0 讨论(0)
  • 2020-12-02 04:01

    Yes assuming you have this:

    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() is guaranteed to run before init() is called, and init() is guaranteed to run before main() is called.

    Keep in mind that init() is always called, regardless if there's main or not, so if you import a package that has an init function, it will be executed.

    Additionally, you can have multiple init() functions per package; they will be executed in the order they show up in the file (after all variables are initialized of course). If they span multiple files, they will be executed in lexical file name order (as pointed out by @benc):

    It seems that init() functions are executed in lexical file name order. The Go spec says "build systems are encouraged to present multiple files belonging to the same package in lexical file name order to a compiler". It seems that go build works this way.


    A lot of the internal Go packages use init() to initialize tables and such, for example https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480

    0 讨论(0)
  • 2020-12-02 04:03

    Take for example a framework or a library you're designing for other users, these users eventually will have a main function in their code in order to execute their app. If the user directly imports a sub-package of your library's project then the init of that sub-package will be called(once) first of all. The same for the root package of the library, etc...

    There are many times when you may want a code block to be executed without the existence of a main func, directly or not.

    If you, as the developer of the imaginary library, import your library's sub-package that has an init function, it will be called first and once, you don't have a main func but you need to make sure that some variables, or a table, will be initialized before the calls of other functions.

    A good thing to remember and not to worry about, is that: the init always execute once per application.

    init execution happens:

    1. right before the init function of the "caller" package,
    2. before the, optionally, main func,
    3. but after the package-level variables, var = [...] or cost = [...],

    When you import a package it will run all of its init functions, by order.

    I'll will give a very good example of an init function. It will add mime types to a standard go's library named mime and a package-level function will use the mime standard package directly to get the custom mime types that are already be initialized at its init function:

    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
    }
    

    Hope that helped you and other users, don't hesitate to post again if you have more questions!

    0 讨论(0)
  • 2020-12-02 04:03

    The init func runs first and then main. It's used for setting something first before your program runs, for example:

    Accessing a template, Running the program using all cores, Checking the Goos and arch etc...

    0 讨论(0)
  • 2020-12-02 04:05

    mutil init function in one package execute order:

    1. const and variable defined file init() function execute

    2. init function execute order by the filename asc

    0 讨论(0)
  • 2020-12-02 04:08

    Something to add to this (which I would've added as a comment but the time of writing this post I'd not yet enough reputation)

    Having multiple inits in the same package I've not yet found any guaranteed way to know what order in which they will be run. For example I have:

    package config
        - config.go
        - router.go
    

    Both config.go and router.go contain init() functions, but when running router.go's function ran first (which caused my app to panic).

    If you're in a situation where you have multiple files, each with its own init() function be very aware that you aren't guaranteed to get one before the other. It is better to use a variable assignment as OneToOne shows in his example. Best part is: This variable declaration will happen before ALL init() functions in the package.

    For example

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

    regardless of whether var ConfigSuccess = configureApplication() exists in router.go or config.go, it will be run before EITHER init() is run.

    0 讨论(0)
提交回复
热议问题