本文翻译自:When is the init() function run?

I've tried to find a precise explanation of what the init() function does in Go. 我试图找到init()函数在Go中的功能的精确解释。 I read what Effective Go says but I was unsure if I understood fully what it said. 我读到了Effective Go所说的内容,但我不确定我是否完全理解它所说的内容。 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. 最后意味着:在包中的所有变量声明都已经评估了它们的初始值设定项之后调用init,并且只有在初始化了所有导入的包之后才会对它们进行求值。

What does all the variable declarations in the package have evaluated their initializers mean? all the variable declarations in the package have evaluated their initializers中的all the variable declarations in the package have evaluated their initializers意味着什么? 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? 这是否意味着如果在包及其文件中声明“全局”变量,init()将不会运行,直到所有它都被评估,然后它将运行所有init函数,然后运行./main_file_name时运行main()?

I also read Mark Summerfield's go book the following: 我还阅读了Mark Summerfield的以下书:

If a package has one or more init() functions they are automatically executed before the main package's main() function is called. 如果一个包有一个或多个init()函数,它们会在调用主包的main()函数之前自动执行。

In my understanding, init() is only relevant when you run intend to run main() right? 根据我的理解, init()仅在运行打算运行main()时才相关? or the Main package. 或主包。 Anyone understands more precisely init() feel free to correct me 任何人都更清楚地了解init()随时纠正我


#1楼

参考:https://stackoom.com/question/1g13X/init-函数何时运行


#2楼

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. AnswerToLife()保证之前运行init()被调用,并且init()保证之前运行main()被调用。

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. 请记住,始终调用init() ,无论是否存在main,因此如果导入具有init函数的包,则会执行该函数。

Additionally, you can have multiple init() functions per package; 此外,每个包可以有多个init()函数; 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 ): 如果它们跨越多个文件,它们将以词汇文件名顺序执行(如@benc所指出的):

It seems that init() functions are executed in lexical file name order. 似乎init()函数以词汇文件名顺序执行。 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". Go规范说“鼓励构建系统以词汇文件名顺序向编译器提供属于同一个包的多个文件”。 It seems that go build works this way. 似乎go build这种方式工作。


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 许多内部Go包使用init()来初始化表等,例如https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480


#3楼

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. 在同一个包中有多个inits我还没有找到任何保证的方式来知道它们将以什么顺序运行。 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). config.gorouter.go都包含init()函数,但是当运行router.go的函数时首先运行(这导致我的应用程序出现恐慌)。

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. 如果您处于多个文件的情况下,每个文件都有自己的init()函数,请注意您不能保证在另一个文件之前得到一个文件。 It is better to use a variable assignment as OneToOne shows in his example. 最好使用OneToOne在他的示例中显示的变量赋值。 Best part is: This variable declaration will happen before ALL init() functions in the package. 最好的部分是:此变量声明将在包中的所有init()函数之前发生。

For example 例如

config.go: 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: router.go:

func init() {var (rwd stringtmp stringok  bool)if metapath, ok := Config["fs"]["metapath"].(string); ok {var err errorConn, 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. 无论在router.goconfig.go中是否存在var ConfigSuccess = configureApplication() ,它都将在运行EITHER init()之前运行。


#4楼

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

Program initialization runs in a single goroutine, but that goroutine may create other goroutines, which run concurrently. 程序初始化在单个goroutine中运行,但该goroutine可能会创建其他并发运行的goroutine。

If a package p imports package q, the completion of q's init functions happens before the start of any of p's. 如果包p导入包q,则q的init函数的完成发生在任何p的开始之前。

The start of the function main.main happens after all init functions have finished. 函数main.main的开始在所有init函数完成后发生。


#5楼

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. 以您为其他用户设计的框架或库为例,这些用户最终将在其代码中具有main function ,以便执行他们的应用程序。 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. 如果用户直接导入库项目的子包,则首先调用该子包的init一次 )。 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. 很多时候, 您可能希望在没有main func情况下执行代码块,无论是否直接执行

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. 如果您作为虚构库的开发人员导入具有init函数的库的子包,它将首先被调用, 一次 ,您没有main func但是您需要确保一些变量,或者一个表,将在其他函数调用之前初始化。

A good thing to remember and not to worry about, is that: the init always execute once per application. 要记住并且不要担心的一件好事是: init始终为每个应用程序执行一次。

init execution happens: init执行发生:

  1. right before the init function of the "caller" package, 就在“调用者”包的init函数之前,
  2. before the, optionally, main func , 在可选的main func
  3. but after the package-level variables, var = [...] or cost = [...] , 但是在包级变量之后, var = [...] or cost = [...]

When you import a package it will run all of its init functions, by order . 导入包时,它将按顺序运行其所有init函数

I'll will give a very good example of an init function. 我将给出一个非常好的init函数示例。 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: 它将mime类型添加到名为mime的标准go库中,并且包级函数将直接使用mime标准包来获取已在其init函数初始化的自定义mime类型:

package mimeimport ("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 errorsmime.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! 希望能帮助您和其他用户,如果您有更多问题,请不要犹豫再次发帖!


#6楼

The init func runs first and then main. init func先运行然后运行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... 访问模板,使用所有核心运行程序,检查Goos和arch等...

init()函数何时运行?相关推荐

  1. Go语言init函数你必须记住的六个特征

    Go应用程序的初始化是在单一的goroutine中执行的.对于包这一级别的初始化来说,在一个包里会先进行包级别变量的初始化.一个包下可以有多个init函数,每个文件也可以有多个init 函数,多个 i ...

  2. linux0.11 init函数,linux0.11启动与初始化

    简单描述Linux0.11的启动与初始化过程. 启动过程中需要关注:IDT, GDT, LDT, TSS, 页表, 堆栈这些数据. 一:启动过程 启动的代码文件为bootsect.s.setup.s. ...

  3. Go中的Init函数

    init函数会在main函数执行之前进行执行.init用在设置包.初始化变量或者其他要在程序运行前优先完成的引导工作. 举例:在进行数据库注册驱动的时候. 这里有init函数 package post ...

  4. python如何同时运行两个函数_关于python:使2个函数同时运行

    我试图让两个函数同时运行. 1 2 3 4 5 6 7 8def func1(): print 'Working' def func2(): print 'Working' func1() func2 ...

  5. 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码......

    当我在窗体初始化的时候,调用了一个外部的dill时,它就不知什么原因的 抛出一个"正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码&quo ...

  6. R语言message函数、warning()函数和stop()函数输出程序运行健康状态信息实战

    R语言message函数.warning()函数和stop()函数输出程序运行健康状态信息实战 目录 R语言message函数.warning()函数和stop()函数输出程序运行健康状态信息实战

  7. Golang init函数执行顺序

    import --> const --> var --> init() 如果一个包导入了其他包,则首先初始化导入的包. 然后初始化当前包的常量. 接下来初始化当前包的变量. 最后,调 ...

  8. 【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )

    文章目录 一.创建 Groovy 代码文件 二.使用 Java 语法实现 Groovy 类和主函数并运行 三.按照 Groovy 语法改造上述 Java 语法规则代码 一.创建 Groovy 代码文件 ...

  9. golang init函数:全局变量优先于 > init函数 > main函数

    golang init函数:全局变量优先于 > init函数 > main函数

最新文章

  1. Android Dialog 弹出的时候标题栏闪烁一下的处理方法
  2. Windows/Linux 下功能强大的桌面截图软件
  3. Charles调试Https iOS
  4. 数据结构与算法专题——第十二题 Trie树
  5. 提高CSS文件可维护性的五种方法
  6. MySQL Fabric集群功能整理---择录官网
  7. IDEA显示完整目录,取消合并的文件,取消“ . “ 的这种目录
  8. Java关键字new和newInstance的区别
  9. java多线程入门1
  10. 因子分析模型 - Python 做因子分析简直比 SPSS 还简单 - ( Python、SPSS)
  11. 《UNP》随笔——“实现一个简单的回射服务器”存在的不足(信号处理)
  12. GIC 介绍 (二)—gic400 使用
  13. php公众号模板消息群发,如何使用微信模板消息免费群发
  14. SimpleDateFormat的概述
  15. Ruby on Rails 的秘笈是什么?
  16. javaweb网上书店图书馆管理系统
  17. Unity Mecanim 动画系统简介
  18. 运营半年多视频号涨粉13万,如何真正挖掘视频号的潜力
  19. JVM类加载机制(算是白话)有问题欢迎评论
  20. 51培训,控制小车实现直走,转弯,停止

热门文章

  1. 机房三维(3D)监控系统和机房可视化动力环境监控系统两者有什么特点?
  2. 使用web进行数据库管理
  3. 精通javascript笔记(智能社)——数字时钟
  4. leetcode -- Single Number
  5. 劳斯稳定方法-RouthMethod
  6. luoguP3912 素数个数
  7. 禁掉或启用firefox 的 javascript 脚本
  8. 一个项目的简单开发流程——需求、数据库、编码
  9. DirectoryInfo类
  10. 如何经由PHP获得MySQL procedure结果