init()函数何时运行?

时间:2014-07-16 20:34:44

标签: go init

我试图找到init()函数在Go中的功能的精确解释。我读了Effective Go所说的内容,但我不确定我是否完全理解它所说的内容。我不确定的确切句子如下:

  

最后意味着:在包中的所有变量声明评估了它们的初始值设定项之后调用init,并且只有在初始化了所有导入的包之后才对它们进行求值。

all the variable declarations in the package have evaluated their initializers是什么意思?这是否意味着你宣布"全球"包中的变量及其文件,init()在评估完所有变量后才会运行,然后运行所有的init函数,然后运行./main_file_name时运行main()?

我还读过Mark Summerfield的书以下内容:

  

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

根据我的理解,init()仅在运行打算运行main()时才有意义吗?或主包。任何人都能更准确地理解init()随时纠正我

11 个答案:

答案 0 :(得分:353)

是的,假设您有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()之前运行

init(),并确保init()在调用main()之前运行。

请记住,始终会调用init(),无论是否有主要内容,因此如果您导入具有init功能的包,则会执行该内容。

//修改

另外,请记住,每个包可以有多个init()个函数,它们将按照它们在代码中显示的顺序执行(当然,在所有变量初始化之后)。

//编辑2x

许多内部Go包使用init()来初始化表格,例如https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480

//编辑3x

@benc在同一个包执行顺序中的多个inits:

  

似乎init()函数以词汇文件名顺序执行。 Go规范说“鼓励构建系统以词汇文件名顺序向编译器提供属于同一个包的多个文件”。似乎go build以这种方式工作。

答案 1 :(得分:132)

看到这张照片。 :)

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

  1. 如果包导入其他包,则首先初始化导入的包。

  2. 然后初始化当前包的常量。

  3. 然后初始化当前包的变量。

  4. 最后,调用当前包的init()函数。

  5.   

    一个包可以有多个init函数(在一个文件中或分布在多个文件中),它们按照它们呈现给编译器的顺序被调用。


      

    即使从多个包中导入包,也只会初始化一次。

答案 2 :(得分:25)

要添加的东西(我会将其作为评论添加但是写这篇文章的时间我还没有足够的声誉)

在同一个包中有多个inits我还没有找到任何保证的方式来知道它们将以什么顺序运行。例如,我有:

package config
    - config.go
    - router.go

config.gorouter.go都包含init()个函数,但在运行router.go时,首先运行的函数(导致我的应用程序出现恐慌)。

如果您处于多个文件的情况下,每个文件都有自己的init()功能,请注意您不能保证在另一个文件之前获得一个文件。在他的示例中,最好使用变量赋值作为OneToOne。最好的部分是:此变量声明将在包中的所有init()函数之前发生。

例如

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

无论var ConfigSuccess = configureApplication()还是router.go中是否存在config.go,它都会在运行E init()之前运行。

答案 3 :(得分:5)

这是另一个例子 - 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 !")
}

上述程序的输出

$ 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 :(得分:4)

以您为其他用户设计的框架或库为例,这些用户最终将在其代码中使用main function来执行其应用。如果用户直接导入您图书馆项目的子包,则首先会调用该子包的init一次)。对于库的根包等也一样......

有很多次您可能希望执行代码块而不存在main func,无论是否直接存在。

如果您作为虚构图书馆的开发者,导入图书馆的具有init功能的子包,则会先调用它,一次,没有main func但您需要确保在调用其他函数之前初始化某些变量或表。

要记住并且不要担心的好事是: init每个应用程序始终执行一次。

执行

init

  1. 就在"来电者的init功能之前"包,
  2. 之前,可选择main func
  3. 但是在包级变量之后,var = [...] or cost = [...]
  4. 导入包时,它会按顺序运行所有初始化函数。

    我将给出一个非常好的init函数示例。它会将mime类型添加到名为mime的标准go库中,并且包级函数将直接使用mime标准包来获取已在其中初始化的自定义mime类型init功能:

    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
    }
    

    希望能帮助您和其他用户,如果您有更多问题,请不要再犹豫了!

答案 5 :(得分:2)

init()函数何时运行?

使用Go 1.16(Q1 2021),您将准确看到它的运行时间以及运行时间。

请参见commit 7c58ef7中的CL (Change List) 254659,并修复issue 41378

运行时:实现GODEBUG=inittrace=1支持

设置inittrace=1会导致运行时为标准错误发出一行 每个程序包都有初始化工作,总结了执行时间和内存分配。

init函数发出的调试信息可用于查找瓶颈 或Go启动性能的下降。

省略了没有init功能的软件包(用户定义或生成的编译器)。

不支持追踪插件初始化,因为它们可以同时执行。这个会 使跟踪的实现更加复杂,同时增加了对罕见的支持 用例。可以通过测试主包导入来分别跟踪插件的初始化 插件包会显式导入。

$ GODEBUG=inittrace=1 go test
init internal/bytealg @0.008 ms, 0 ms clock, 0 bytes, 0 allocs
init runtime @0.059 ms, 0.026 ms clock, 0 bytes, 0 allocs
init math @0.19 ms, 0.001 ms clock, 0 bytes, 0 allocs
init errors @0.22 ms, 0.004 ms clock, 0 bytes, 0 allocs
init strconv @0.24 ms, 0.002 ms clock, 32 bytes, 2 allocs
init sync @0.28 ms, 0.003 ms clock, 16 bytes, 1 allocs
init unicode @0.44 ms, 0.11 ms clock, 23328 bytes, 24 allocs
...

受到stapelberg@google.com的启发,他为doInit 用GDB测量init次的原型。

答案 6 :(得分:1)

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

  

程序初始化在单个goroutine中运行,但该goroutine可能会创建其他同时运行的goroutine。

     

如果包p导入包q,则q的初始化函数的完成发生在任何p的开始之前。

     

函数main.main的开始在所有init函数完成后发生。

答案 7 :(得分:1)

init将在任何地方调用使用其包(无论是空白导入还是导入),但只能使用一次。

这是一个包:

package demo

import (
    "some/logs"
)

var count int

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

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

任何包(主包或任何测试包)都将其导入为空白:

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

或使用它导入它func:

"printfcoder.com/we/models/demo"

func someFunc(){
   demo.Do()
}

init只会记录一次0。 使用它的第一个包,它的init func将在包的init之前运行。所以:

A调用B,B调用C,所有调用都有init函数,C的init将在B之前运行,B在A之前运行。

答案 8 :(得分:1)

mutil init函数在一个包执行顺序中:

  1. const和变量定义文件init()函数执行

  2. init函数按文件名asc执行顺序

答案 9 :(得分:0)

init func先运行然后运行main。它用于在程序运行之前先设置一些东西,例如:

访问模板,  使用所有核心运行程序,  检查Goos和拱门等......

答案 10 :(得分:0)

更多提示:

  • 只能有1个main()函数,但可以有许多init()函数。
  • 您不需要显式调用init()或main(),它们会自动被调用。
  • init()和main()不接受任何参数,也不返回任何东西。
  • init()在main()之前运行。
  • 如果有许多init(),它们将按声明的顺序运行。