When is the init() function run?

GoInit

Go Problem Overview


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 intend to run main() right? Anyone understands more precisely init() feel free to correct me

Go Solutions


Solution 1 - Go

Yes assuming you have this:

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

Solution 2 - Go

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.

Solution 3 - Go

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.

Solution 4 - Go

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

package main

import (
    "fmt"
)

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

var test = callOut()

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

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

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

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

Output of the above program

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

Solution 5 - Go

> When is the init() function run?

With Go 1.16 (Q1 2021), you will see precisely when it runs, and for how long.

See commit 7c58ef7 from CL (Change List) 254659, fixing issue 41378 .

>## Runtime: implement GODEBUG=inittrace=1 support > >Setting inittrace=1 causes the runtime to emit a single line to standard error for each package with init work, summarizing the execution time and memory allocation. > >The emitted debug information for init functions can be used to find bottlenecks or regressions in Go startup performance. > >Packages with no init function work (user defined or compiler generated) are omitted. > >Tracing plugin inits is not supported as they can execute concurrently. This would make the implementation of tracing more complex while adding support for a very rare use case. Plugin inits can be traced separately by testing a main package importing the plugins package imports explicitly. > >bash >$ 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 >... > > Inspired by [email protected] who instrumented doInit in a prototype to measure init times with GDB.

Solution 6 - Go

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!

Solution 7 - Go

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.

Solution 8 - Go

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

Solution 9 - Go

A few more tips:

> * There can only be 1 main() function, but there can be many init() functions. > * You do not need to explicitly call init() or main(), they are called automatically. > * init() and main() do not accept any parameters and also don't return anything. > * init() runs before main(). > * If you have many init(), they run in the order they are declared.

Solution 10 - Go

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.

Solution 11 - Go

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCharlie ParkerView Question on Stackoverflow
Solution 1 - GoOneOfOneView Answer on Stackoverflow
Solution 2 - GoweamingView Answer on Stackoverflow
Solution 3 - GorifflockView Answer on Stackoverflow
Solution 4 - GoAlok Kumar SinghView Answer on Stackoverflow
Solution 5 - GoVonCView Answer on Stackoverflow
Solution 6 - GokatarasView Answer on Stackoverflow
Solution 7 - GoSchultz9999View Answer on Stackoverflow
Solution 8 - GoToky LiuView Answer on Stackoverflow
Solution 9 - GokintsukuroiView Answer on Stackoverflow
Solution 10 - GoXian ShuView Answer on Stackoverflow
Solution 11 - Goharold ramosView Answer on Stackoverflow