douerqu2319
douerqu2319
2014-07-16 20:34
浏览 942
已采纳

init()函数何时运行?

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 said. The exact sentence I am unsure is the following:

And finally means finally: init is called after all the variable declarations in the package have evaluated their initializers, and those are evaluated only after all the imported packages have been initialized.

What does all the variable declarations in the package have evaluated their initializers mean? Does it mean if you declare "global" variables in a package and its files, init() will not run until all of it is evaluated and then it will run all the init function and then main() when ./main_file_name is ran?

I also read Mark Summerfield's go book the following:

If a package has one or more init() functions they are automatically executed before the main package's main() function is called.

In my understanding, init() is only relevant when you run intend to run main() right? or the Main package. Anyone understands more precisely init() feel free to correct me

图片转代码服务由CSDN问答提供 功能建议

我试图找到有关 init()函数做什么的精确解释 在Go中。 我阅读了有效Go 所说的内容,但不确定是否完全理解它的意思。 我不确定的确切句子如下:

最后意味着最后:在包中的所有变量声明都评估了其初始值设定项之后,将调用init,这些是

包中的所有变量声明都对其初始化程序进行了评估是什么意思? 这是否意味着如果在包及其文件中声明“全局”变量,则init()直到所有值都经过评估后才会运行,然后在运行./main_file_name时它将先运行所有的init函数,然后运行main()?

我还阅读了Mark Summerfield的以下内容:

如果一个包具有一个或多个init()函数,它们就是 在调用主程序包的main()函数之前自动执行。

据我所知, init()仅在您运行时相关 打算运行main()对吗? 或主包装。 任何人都可以更精确地理解 init()随时纠正我

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • dongre6270
    dongre6270 2014-07-16 20:46
    已采纳

    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

    点赞 评论
  • drv13270
    drv13270 2014-12-09 21: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.

    点赞 评论
  • duanli8391
    duanli8391 2017-02-15 22:58

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

    Program initialization runs in a single goroutine, but that goroutine may create other goroutines, which run concurrently.

    If a package p imports package q, the completion of q's init functions happens before the start of any of p's.

    The start of the function main.main happens after all init functions have finished.

    点赞 评论
  • douhuang1973
    douhuang1973 2017-04-11 12:18

    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!

    点赞 评论
  • douzi8916
    douzi8916 2017-06-06 11:10

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

    点赞 评论
  • dou8mwz5079
    dou8mwz5079 2017-06-16 07:49

    init will be called everywhere uses its package(no matter blank import or import), but only one time.

    this is a package:

    package demo
    
    import (
        "some/logs"
    )
    
    var count int
    
    func init() {
        logs.Debug(count)
    }
    
    // Do do
    func Do() {
        logs.Debug("dd")
    }
    

    any package(main package or any test package) import it as blank :

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

    or import it using it func:

    "printfcoder.com/we/models/demo"
    
    func someFunc(){
       demo.Do()
    }
    

    the init will log 0 only one time. the first package using it, its init func will run before the package's init. So:

    A calls B, B calls C, all of them have init func, the C's init will be run first before B's, B's before A's.

    点赞 评论
  • dongshuofu0039
    dongshuofu0039 2017-09-30 17:16

    Here is another example - 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 !")
    }
    

    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 !
    
    点赞 评论
  • doutandusegang2961
    doutandusegang2961 2018-04-04 08:10

    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

    点赞 评论
  • dqjo4340
    dqjo4340 2018-04-14 11:38

    See this picture. :)

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

    1. If a package imports other packages, the imported packages are initialized first.

    2. Current package's constant initialized then.

    3. Current package's variables are initialized then.

    4. Finally, init() function of current package is called.

    A package can have multiple init functions (either in a single file or distributed across multiple files) and they are called in the order in which they are presented to the compiler.


    A package will be initialised only once even if it is imported from multiple packages.

    点赞 评论

相关推荐