init()函数何时运行?

我试图找到一个精确的解释init()函数在Go中的作用。我读了有效的去说,但我不确定我是否完全理解它说什么。我不太确定的句子是:

finally的意思是最后:init是在包中所有变量声明都计算了它们的初始化式之后调用的,并且只有在所有导入的包都初始化之后才会计算这些初始化式。

all the variable declarations in the package have evaluated their initializers是什么意思?这是否意味着如果你宣称“全球”;一个包及其文件中的变量,init()将不会运行,直到它的所有内容都被求值,然后它将运行所有init函数,然后main()当./main_file_name运行?

我还读了Mark Summerfield的书:

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

在我的理解中,init()只在你打算运行main()时才相关,对吗?任何人都能更准确地理解init(),请随意纠正我

218090 次浏览

是的,假设你有:

var WhatIsThe = AnswerToLife()


func AnswerToLife() int { // 1
return 42
}


func init() { // 2
WhatIsThe = 0
}


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

AnswerToLife()保证在调用init()之前运行,而init()保证在调用main()之前运行。

请记住,无论是否存在main, init()总是被调用,所以如果你导入了一个具有init函数的包,它将被执行。

此外,每个包可以有多个init()函数;它们将按照它们在文件中出现的顺序执行(当然是在所有变量初始化之后)。如果它们跨越多个文件,它们将按词法文件名顺序执行(如@benc所指出的):

init()函数似乎是按词法文件名顺序执行的。Go规范说“构建系统鼓励将属于同一个包的多个文件按词法文件名顺序呈现给编译器”。go build似乎是这样工作的。


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

补充一点(我本可以作为评论添加的,但在写这篇文章的时候,我还没有足够的声誉)

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

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.goconfig.go中,它都将在init()运行之前运行。

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

程序初始化在单个goroutine中运行,但该goroutine可以创建其他goroutine,这些goroutine可以并发运行。

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

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

以你为其他用户设计的框架或库为例,这些用户最终会在他们的代码中有一个main function,以便执行他们的应用程序。如果用户直接导入你库项目的子包,那么该子包的init将首先被调用(一次)。对于库的根包也是一样的,等等…

有很多时候,您可能希望执行一个代码块不存在main func,直接或不直接。

如果你作为虚拟库的开发人员,导入你的库的子包,它有一个init函数,它将首先被调用,而一次,你没有main func,但你需要确保一些变量或表将在其他函数调用之前被初始化。

有一件事值得记住,不必担心,那就是: init总是在每个应用程序中执行一次

init执行发生:

  1. 就在"caller"包的init函数之前,
  2. main func之前,可选,
  3. 但是在包级变量var = [...] or cost = [...]之后,

当你导入一个包时,它会按顺序运行所有的init函数

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

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
}

希望这对你和其他用户有所帮助,如果你有更多的问题,不要犹豫再次发帖!

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

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

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"

或者使用it func导入它:

"printfcoder.com/we/models/demo"


func someFunc(){
demo.Do()
}
init将只记录0一次。 第一个使用它的包,它的init func将在包的init之前运行。所以:< / p >

A调用B B调用C,它们都有init func, C的init会在B之前运行,B在A之前运行。

下面是另一个例子——https://play.golang.org/p/9P-LmSkUMKY

package main


import (
"fmt"
)


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


var test = callOut()


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


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


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


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

上面程序的输出

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

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

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

  2. 初始化函数按文件名asc执行

看这张照片。:)

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

< img src = " https://astaxie.gitbooks.io/build-web-application-with-golang/en/images/2.3.init.png?生= true " alt = " " >

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

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

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

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

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


一个包只能被初始化一次,即使它是从多个包中导入的。

还有一些建议:

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

init()函数什么时候运行?

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

参见CL(更改列表)254659中的提交7 c58ef7,修复发行41378

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

设置inittrace=1会导致运行时发出单行标准错误 每个包都有init工作,总结执行时间和内存分配 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