When is the init() function run?











up vote
249
down vote

favorite
66












I've tried to find a precise explanation of what the init() function does in Go. I read what Effective Go says but I was unsure if I understood fully what it said. The exact sentence I am unsure is the following:




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




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



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




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




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










share|improve this question




























    up vote
    249
    down vote

    favorite
    66












    I've tried to find a precise explanation of what the init() function does in Go. I read what Effective Go says but I was unsure if I understood fully what it said. The exact sentence I am unsure is the following:




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




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



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




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




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










    share|improve this question


























      up vote
      249
      down vote

      favorite
      66









      up vote
      249
      down vote

      favorite
      66






      66





      I've tried to find a precise explanation of what the init() function does in Go. I read what Effective Go says but I was unsure if I understood fully what it said. The exact sentence I am unsure is the following:




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




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



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




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




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










      share|improve this question















      I've tried to find a precise explanation of what the init() function does in Go. I read what Effective Go says but I was unsure if I understood fully what it said. The exact sentence I am unsure is the following:




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




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



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




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




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







      go init






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jul 13 at 21:54









      Tim Cooper

      117k31235224




      117k31235224










      asked Jul 16 '14 at 20:34









      Pinocchio

      3,910114579




      3,910114579
























          9 Answers
          9






          active

          oldest

          votes

















          up vote
          317
          down vote



          accepted










          Yes assuming you have this:



          var WhatIsThe = AnswerToLife()

          func AnswerToLife() int {
          return 42
          }

          func init() {
          WhatIsThe = 0
          }

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


          AnswerToLife() is guaranteed to run before init() is called, and init() is guaranteed to run before main() is called.



          Keep in mind that init() is always called, regardless if there's main or not, so if you import a package that has an init function, it will be executed.



          //edit



          Also, keep in mind that you can have multiple init() functions per package, they will be executed in the order they show up in the code (after all variables are initialized of course).



          //edit 2x



          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



          //edit 3x



          Multiple inits in the same package execution order 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.







          share|improve this answer























          • init() is a per package thing, I think... Thus, does it mean that if different files have their own inits, all the inints are always ran right before the main() is ran? Can you also clarify for me one thing, why would you have an init() without a main and how does that work? Does it mean init() is the last thing ran before the package is imported? Otherwise, if its not imported and there is no main, the program will never execute...right? (unless its a test file I guess...)
            – Pinocchio
            Jul 16 '14 at 20:51








          • 3




            There are a lot of reasons to run init without the package having main, for example if you need to initialize several variables or to load some files or do one-time-calculations. now if your entire program is one package that's not really needed, however if it's multiple packages, some of them could need to do some initialization specific to it.
            – OneOfOne
            Jul 16 '14 at 20:56






          • 3




            @Pinocchio There will always be one (and only one) main() when you execute a go program. And init() functions are run before that one main(). However not all packages need a main(). If e.g. you're creating a reusable package with utility functions for connecting to a database, that package shouldn't have a main(). But it could have an init(). When you use that database package in a program, the program will have a main() though.
            – nos
            Sep 22 '14 at 12:24








          • 6




            Code in the playground: play.golang.org/p/T3b5Ddn9ab
            – F21
            Oct 14 '15 at 22:31






          • 1




            @OneOfOne after a few tests, 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.
            – bench
            May 22 at 13:21


















          up vote
          75
          down vote













          See this picture. :)



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






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


          2. Current package's constant initialized then.


          3. Current package's variables are initialiszd 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.







          share|improve this answer



















          • 2




            Thanks for this. Adding some text makes sense to this diagram.
            – Balaji Boggaram Ramanarayan
            Apr 19 at 18:38


















          up vote
          25
          down vote













          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.






          share|improve this answer



















          • 3




            Just my two cents: You could separate "simple init" from complex (panic-raising) initialization. If your're panicking at init(), you're giving no chance to the main program. Maybe a func initialize|loadConfig|connect separated from func init, leaving func init() for basic stuff (without panic). This separation also removes the need of the hack to ensure init order. Hope to be helpful.
            – Lucio M. Tato
            Mar 2 '15 at 12:52






          • 3




            Quote from the Language Specification: A package with no imports is initialized by assigning initial values to all its package-level variables followed by calling all init functions in the order they appear in the source, possibly in multiple files, as presented to the compiler. To ensure reproducible initialization behavior, build systems are encouraged to present multiple files belonging to the same package in lexical file name order to a compiler.
            – updogliu
            Aug 13 '15 at 23:41








          • 1




            The unfortunate thing I encountered in my application was that it didn't execute the init functions in lexical order. It may have been a compiler bug that has since been fixed. I didn't bother to check if there were any issues related to this.
            – rifflock
            Aug 15 '15 at 0:53






          • 1




            Important comment from updogliu above. This does not seem to hold true when imports are involved. Running into a case here where I have a test that relies on multiple imported packages. And the trick of using the package-level variables does not help me prevent init() methods on dependent packages being run before my variable assigned function.
            – uncrase
            Aug 24 '15 at 20:28






          • 1




            The ordering of the init() calls within a single package is dictated by how they are fed into the compiler; the go tool orders files alphabetically. From then on, within a single file they are initialized in syntactic order. edited for word choice
            – adityajones
            Jun 20 '16 at 22:52




















          up vote
          5
          down vote













          Here is another example - https://github.com/alok87/gobyexample/blob/master/init/init.go



          package main

          import (
          "fmt"
          )

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

          var test = callOut()

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

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

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

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


          Output of the above program



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





          share|improve this answer




























            up vote
            4
            down vote













            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!






            share|improve this answer




























              up vote
              1
              down vote













              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.







              share|improve this answer




























                up vote
                1
                down vote













                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.






                share|improve this answer






























                  up vote
                  1
                  down vote













                  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







                  share|improve this answer




























                    up vote
                    0
                    down vote













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






                    share|improve this answer























                      Your Answer






                      StackExchange.ifUsing("editor", function () {
                      StackExchange.using("externalEditor", function () {
                      StackExchange.using("snippets", function () {
                      StackExchange.snippets.init();
                      });
                      });
                      }, "code-snippets");

                      StackExchange.ready(function() {
                      var channelOptions = {
                      tags: "".split(" "),
                      id: "1"
                      };
                      initTagRenderer("".split(" "), "".split(" "), channelOptions);

                      StackExchange.using("externalEditor", function() {
                      // Have to fire editor after snippets, if snippets enabled
                      if (StackExchange.settings.snippets.snippetsEnabled) {
                      StackExchange.using("snippets", function() {
                      createEditor();
                      });
                      }
                      else {
                      createEditor();
                      }
                      });

                      function createEditor() {
                      StackExchange.prepareEditor({
                      heartbeatType: 'answer',
                      convertImagesToLinks: true,
                      noModals: true,
                      showLowRepImageUploadWarning: true,
                      reputationToPostImages: 10,
                      bindNavPrevention: true,
                      postfix: "",
                      imageUploader: {
                      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                      allowUrls: true
                      },
                      onDemand: true,
                      discardSelector: ".discard-answer"
                      ,immediatelyShowMarkdownHelp:true
                      });


                      }
                      });














                       

                      draft saved


                      draft discarded


















                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f24790175%2fwhen-is-the-init-function-run%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown

























                      9 Answers
                      9






                      active

                      oldest

                      votes








                      9 Answers
                      9






                      active

                      oldest

                      votes









                      active

                      oldest

                      votes






                      active

                      oldest

                      votes








                      up vote
                      317
                      down vote



                      accepted










                      Yes assuming you have this:



                      var WhatIsThe = AnswerToLife()

                      func AnswerToLife() int {
                      return 42
                      }

                      func init() {
                      WhatIsThe = 0
                      }

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


                      AnswerToLife() is guaranteed to run before init() is called, and init() is guaranteed to run before main() is called.



                      Keep in mind that init() is always called, regardless if there's main or not, so if you import a package that has an init function, it will be executed.



                      //edit



                      Also, keep in mind that you can have multiple init() functions per package, they will be executed in the order they show up in the code (after all variables are initialized of course).



                      //edit 2x



                      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



                      //edit 3x



                      Multiple inits in the same package execution order 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.







                      share|improve this answer























                      • init() is a per package thing, I think... Thus, does it mean that if different files have their own inits, all the inints are always ran right before the main() is ran? Can you also clarify for me one thing, why would you have an init() without a main and how does that work? Does it mean init() is the last thing ran before the package is imported? Otherwise, if its not imported and there is no main, the program will never execute...right? (unless its a test file I guess...)
                        – Pinocchio
                        Jul 16 '14 at 20:51








                      • 3




                        There are a lot of reasons to run init without the package having main, for example if you need to initialize several variables or to load some files or do one-time-calculations. now if your entire program is one package that's not really needed, however if it's multiple packages, some of them could need to do some initialization specific to it.
                        – OneOfOne
                        Jul 16 '14 at 20:56






                      • 3




                        @Pinocchio There will always be one (and only one) main() when you execute a go program. And init() functions are run before that one main(). However not all packages need a main(). If e.g. you're creating a reusable package with utility functions for connecting to a database, that package shouldn't have a main(). But it could have an init(). When you use that database package in a program, the program will have a main() though.
                        – nos
                        Sep 22 '14 at 12:24








                      • 6




                        Code in the playground: play.golang.org/p/T3b5Ddn9ab
                        – F21
                        Oct 14 '15 at 22:31






                      • 1




                        @OneOfOne after a few tests, 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.
                        – bench
                        May 22 at 13:21















                      up vote
                      317
                      down vote



                      accepted










                      Yes assuming you have this:



                      var WhatIsThe = AnswerToLife()

                      func AnswerToLife() int {
                      return 42
                      }

                      func init() {
                      WhatIsThe = 0
                      }

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


                      AnswerToLife() is guaranteed to run before init() is called, and init() is guaranteed to run before main() is called.



                      Keep in mind that init() is always called, regardless if there's main or not, so if you import a package that has an init function, it will be executed.



                      //edit



                      Also, keep in mind that you can have multiple init() functions per package, they will be executed in the order they show up in the code (after all variables are initialized of course).



                      //edit 2x



                      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



                      //edit 3x



                      Multiple inits in the same package execution order 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.







                      share|improve this answer























                      • init() is a per package thing, I think... Thus, does it mean that if different files have their own inits, all the inints are always ran right before the main() is ran? Can you also clarify for me one thing, why would you have an init() without a main and how does that work? Does it mean init() is the last thing ran before the package is imported? Otherwise, if its not imported and there is no main, the program will never execute...right? (unless its a test file I guess...)
                        – Pinocchio
                        Jul 16 '14 at 20:51








                      • 3




                        There are a lot of reasons to run init without the package having main, for example if you need to initialize several variables or to load some files or do one-time-calculations. now if your entire program is one package that's not really needed, however if it's multiple packages, some of them could need to do some initialization specific to it.
                        – OneOfOne
                        Jul 16 '14 at 20:56






                      • 3




                        @Pinocchio There will always be one (and only one) main() when you execute a go program. And init() functions are run before that one main(). However not all packages need a main(). If e.g. you're creating a reusable package with utility functions for connecting to a database, that package shouldn't have a main(). But it could have an init(). When you use that database package in a program, the program will have a main() though.
                        – nos
                        Sep 22 '14 at 12:24








                      • 6




                        Code in the playground: play.golang.org/p/T3b5Ddn9ab
                        – F21
                        Oct 14 '15 at 22:31






                      • 1




                        @OneOfOne after a few tests, 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.
                        – bench
                        May 22 at 13:21













                      up vote
                      317
                      down vote



                      accepted







                      up vote
                      317
                      down vote



                      accepted






                      Yes assuming you have this:



                      var WhatIsThe = AnswerToLife()

                      func AnswerToLife() int {
                      return 42
                      }

                      func init() {
                      WhatIsThe = 0
                      }

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


                      AnswerToLife() is guaranteed to run before init() is called, and init() is guaranteed to run before main() is called.



                      Keep in mind that init() is always called, regardless if there's main or not, so if you import a package that has an init function, it will be executed.



                      //edit



                      Also, keep in mind that you can have multiple init() functions per package, they will be executed in the order they show up in the code (after all variables are initialized of course).



                      //edit 2x



                      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



                      //edit 3x



                      Multiple inits in the same package execution order 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.







                      share|improve this answer














                      Yes assuming you have this:



                      var WhatIsThe = AnswerToLife()

                      func AnswerToLife() int {
                      return 42
                      }

                      func init() {
                      WhatIsThe = 0
                      }

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


                      AnswerToLife() is guaranteed to run before init() is called, and init() is guaranteed to run before main() is called.



                      Keep in mind that init() is always called, regardless if there's main or not, so if you import a package that has an init function, it will be executed.



                      //edit



                      Also, keep in mind that you can have multiple init() functions per package, they will be executed in the order they show up in the code (after all variables are initialized of course).



                      //edit 2x



                      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



                      //edit 3x



                      Multiple inits in the same package execution order 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.








                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited May 22 at 23:48

























                      answered Jul 16 '14 at 20:46









                      OneOfOne

                      58.5k10112135




                      58.5k10112135












                      • init() is a per package thing, I think... Thus, does it mean that if different files have their own inits, all the inints are always ran right before the main() is ran? Can you also clarify for me one thing, why would you have an init() without a main and how does that work? Does it mean init() is the last thing ran before the package is imported? Otherwise, if its not imported and there is no main, the program will never execute...right? (unless its a test file I guess...)
                        – Pinocchio
                        Jul 16 '14 at 20:51








                      • 3




                        There are a lot of reasons to run init without the package having main, for example if you need to initialize several variables or to load some files or do one-time-calculations. now if your entire program is one package that's not really needed, however if it's multiple packages, some of them could need to do some initialization specific to it.
                        – OneOfOne
                        Jul 16 '14 at 20:56






                      • 3




                        @Pinocchio There will always be one (and only one) main() when you execute a go program. And init() functions are run before that one main(). However not all packages need a main(). If e.g. you're creating a reusable package with utility functions for connecting to a database, that package shouldn't have a main(). But it could have an init(). When you use that database package in a program, the program will have a main() though.
                        – nos
                        Sep 22 '14 at 12:24








                      • 6




                        Code in the playground: play.golang.org/p/T3b5Ddn9ab
                        – F21
                        Oct 14 '15 at 22:31






                      • 1




                        @OneOfOne after a few tests, 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.
                        – bench
                        May 22 at 13:21


















                      • init() is a per package thing, I think... Thus, does it mean that if different files have their own inits, all the inints are always ran right before the main() is ran? Can you also clarify for me one thing, why would you have an init() without a main and how does that work? Does it mean init() is the last thing ran before the package is imported? Otherwise, if its not imported and there is no main, the program will never execute...right? (unless its a test file I guess...)
                        – Pinocchio
                        Jul 16 '14 at 20:51








                      • 3




                        There are a lot of reasons to run init without the package having main, for example if you need to initialize several variables or to load some files or do one-time-calculations. now if your entire program is one package that's not really needed, however if it's multiple packages, some of them could need to do some initialization specific to it.
                        – OneOfOne
                        Jul 16 '14 at 20:56






                      • 3




                        @Pinocchio There will always be one (and only one) main() when you execute a go program. And init() functions are run before that one main(). However not all packages need a main(). If e.g. you're creating a reusable package with utility functions for connecting to a database, that package shouldn't have a main(). But it could have an init(). When you use that database package in a program, the program will have a main() though.
                        – nos
                        Sep 22 '14 at 12:24








                      • 6




                        Code in the playground: play.golang.org/p/T3b5Ddn9ab
                        – F21
                        Oct 14 '15 at 22:31






                      • 1




                        @OneOfOne after a few tests, 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.
                        – bench
                        May 22 at 13:21
















                      init() is a per package thing, I think... Thus, does it mean that if different files have their own inits, all the inints are always ran right before the main() is ran? Can you also clarify for me one thing, why would you have an init() without a main and how does that work? Does it mean init() is the last thing ran before the package is imported? Otherwise, if its not imported and there is no main, the program will never execute...right? (unless its a test file I guess...)
                      – Pinocchio
                      Jul 16 '14 at 20:51






                      init() is a per package thing, I think... Thus, does it mean that if different files have their own inits, all the inints are always ran right before the main() is ran? Can you also clarify for me one thing, why would you have an init() without a main and how does that work? Does it mean init() is the last thing ran before the package is imported? Otherwise, if its not imported and there is no main, the program will never execute...right? (unless its a test file I guess...)
                      – Pinocchio
                      Jul 16 '14 at 20:51






                      3




                      3




                      There are a lot of reasons to run init without the package having main, for example if you need to initialize several variables or to load some files or do one-time-calculations. now if your entire program is one package that's not really needed, however if it's multiple packages, some of them could need to do some initialization specific to it.
                      – OneOfOne
                      Jul 16 '14 at 20:56




                      There are a lot of reasons to run init without the package having main, for example if you need to initialize several variables or to load some files or do one-time-calculations. now if your entire program is one package that's not really needed, however if it's multiple packages, some of them could need to do some initialization specific to it.
                      – OneOfOne
                      Jul 16 '14 at 20:56




                      3




                      3




                      @Pinocchio There will always be one (and only one) main() when you execute a go program. And init() functions are run before that one main(). However not all packages need a main(). If e.g. you're creating a reusable package with utility functions for connecting to a database, that package shouldn't have a main(). But it could have an init(). When you use that database package in a program, the program will have a main() though.
                      – nos
                      Sep 22 '14 at 12:24






                      @Pinocchio There will always be one (and only one) main() when you execute a go program. And init() functions are run before that one main(). However not all packages need a main(). If e.g. you're creating a reusable package with utility functions for connecting to a database, that package shouldn't have a main(). But it could have an init(). When you use that database package in a program, the program will have a main() though.
                      – nos
                      Sep 22 '14 at 12:24






                      6




                      6




                      Code in the playground: play.golang.org/p/T3b5Ddn9ab
                      – F21
                      Oct 14 '15 at 22:31




                      Code in the playground: play.golang.org/p/T3b5Ddn9ab
                      – F21
                      Oct 14 '15 at 22:31




                      1




                      1




                      @OneOfOne after a few tests, 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.
                      – bench
                      May 22 at 13:21




                      @OneOfOne after a few tests, 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.
                      – bench
                      May 22 at 13:21












                      up vote
                      75
                      down vote













                      See this picture. :)



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






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


                      2. Current package's constant initialized then.


                      3. Current package's variables are initialiszd 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.







                      share|improve this answer



















                      • 2




                        Thanks for this. Adding some text makes sense to this diagram.
                        – Balaji Boggaram Ramanarayan
                        Apr 19 at 18:38















                      up vote
                      75
                      down vote













                      See this picture. :)



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






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


                      2. Current package's constant initialized then.


                      3. Current package's variables are initialiszd 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.







                      share|improve this answer



















                      • 2




                        Thanks for this. Adding some text makes sense to this diagram.
                        – Balaji Boggaram Ramanarayan
                        Apr 19 at 18:38













                      up vote
                      75
                      down vote










                      up vote
                      75
                      down vote









                      See this picture. :)



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






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


                      2. Current package's constant initialized then.


                      3. Current package's variables are initialiszd 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.







                      share|improve this answer














                      See this picture. :)



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






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


                      2. Current package's constant initialized then.


                      3. Current package's variables are initialiszd 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.








                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Nov 9 at 13:08









                      Emruz Hossain

                      89929




                      89929










                      answered Apr 14 at 11:38









                      weaming

                      94177




                      94177








                      • 2




                        Thanks for this. Adding some text makes sense to this diagram.
                        – Balaji Boggaram Ramanarayan
                        Apr 19 at 18:38














                      • 2




                        Thanks for this. Adding some text makes sense to this diagram.
                        – Balaji Boggaram Ramanarayan
                        Apr 19 at 18:38








                      2




                      2




                      Thanks for this. Adding some text makes sense to this diagram.
                      – Balaji Boggaram Ramanarayan
                      Apr 19 at 18:38




                      Thanks for this. Adding some text makes sense to this diagram.
                      – Balaji Boggaram Ramanarayan
                      Apr 19 at 18:38










                      up vote
                      25
                      down vote













                      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.






                      share|improve this answer



















                      • 3




                        Just my two cents: You could separate "simple init" from complex (panic-raising) initialization. If your're panicking at init(), you're giving no chance to the main program. Maybe a func initialize|loadConfig|connect separated from func init, leaving func init() for basic stuff (without panic). This separation also removes the need of the hack to ensure init order. Hope to be helpful.
                        – Lucio M. Tato
                        Mar 2 '15 at 12:52






                      • 3




                        Quote from the Language Specification: A package with no imports is initialized by assigning initial values to all its package-level variables followed by calling all init functions in the order they appear in the source, possibly in multiple files, as presented to the compiler. To ensure reproducible initialization behavior, build systems are encouraged to present multiple files belonging to the same package in lexical file name order to a compiler.
                        – updogliu
                        Aug 13 '15 at 23:41








                      • 1




                        The unfortunate thing I encountered in my application was that it didn't execute the init functions in lexical order. It may have been a compiler bug that has since been fixed. I didn't bother to check if there were any issues related to this.
                        – rifflock
                        Aug 15 '15 at 0:53






                      • 1




                        Important comment from updogliu above. This does not seem to hold true when imports are involved. Running into a case here where I have a test that relies on multiple imported packages. And the trick of using the package-level variables does not help me prevent init() methods on dependent packages being run before my variable assigned function.
                        – uncrase
                        Aug 24 '15 at 20:28






                      • 1




                        The ordering of the init() calls within a single package is dictated by how they are fed into the compiler; the go tool orders files alphabetically. From then on, within a single file they are initialized in syntactic order. edited for word choice
                        – adityajones
                        Jun 20 '16 at 22:52

















                      up vote
                      25
                      down vote













                      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.






                      share|improve this answer



















                      • 3




                        Just my two cents: You could separate "simple init" from complex (panic-raising) initialization. If your're panicking at init(), you're giving no chance to the main program. Maybe a func initialize|loadConfig|connect separated from func init, leaving func init() for basic stuff (without panic). This separation also removes the need of the hack to ensure init order. Hope to be helpful.
                        – Lucio M. Tato
                        Mar 2 '15 at 12:52






                      • 3




                        Quote from the Language Specification: A package with no imports is initialized by assigning initial values to all its package-level variables followed by calling all init functions in the order they appear in the source, possibly in multiple files, as presented to the compiler. To ensure reproducible initialization behavior, build systems are encouraged to present multiple files belonging to the same package in lexical file name order to a compiler.
                        – updogliu
                        Aug 13 '15 at 23:41








                      • 1




                        The unfortunate thing I encountered in my application was that it didn't execute the init functions in lexical order. It may have been a compiler bug that has since been fixed. I didn't bother to check if there were any issues related to this.
                        – rifflock
                        Aug 15 '15 at 0:53






                      • 1




                        Important comment from updogliu above. This does not seem to hold true when imports are involved. Running into a case here where I have a test that relies on multiple imported packages. And the trick of using the package-level variables does not help me prevent init() methods on dependent packages being run before my variable assigned function.
                        – uncrase
                        Aug 24 '15 at 20:28






                      • 1




                        The ordering of the init() calls within a single package is dictated by how they are fed into the compiler; the go tool orders files alphabetically. From then on, within a single file they are initialized in syntactic order. edited for word choice
                        – adityajones
                        Jun 20 '16 at 22:52















                      up vote
                      25
                      down vote










                      up vote
                      25
                      down vote









                      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.






                      share|improve this answer














                      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.







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited May 23 '17 at 12:02









                      Community

                      11




                      11










                      answered Dec 9 '14 at 21:08









                      rifflock

                      39135




                      39135








                      • 3




                        Just my two cents: You could separate "simple init" from complex (panic-raising) initialization. If your're panicking at init(), you're giving no chance to the main program. Maybe a func initialize|loadConfig|connect separated from func init, leaving func init() for basic stuff (without panic). This separation also removes the need of the hack to ensure init order. Hope to be helpful.
                        – Lucio M. Tato
                        Mar 2 '15 at 12:52






                      • 3




                        Quote from the Language Specification: A package with no imports is initialized by assigning initial values to all its package-level variables followed by calling all init functions in the order they appear in the source, possibly in multiple files, as presented to the compiler. To ensure reproducible initialization behavior, build systems are encouraged to present multiple files belonging to the same package in lexical file name order to a compiler.
                        – updogliu
                        Aug 13 '15 at 23:41








                      • 1




                        The unfortunate thing I encountered in my application was that it didn't execute the init functions in lexical order. It may have been a compiler bug that has since been fixed. I didn't bother to check if there were any issues related to this.
                        – rifflock
                        Aug 15 '15 at 0:53






                      • 1




                        Important comment from updogliu above. This does not seem to hold true when imports are involved. Running into a case here where I have a test that relies on multiple imported packages. And the trick of using the package-level variables does not help me prevent init() methods on dependent packages being run before my variable assigned function.
                        – uncrase
                        Aug 24 '15 at 20:28






                      • 1




                        The ordering of the init() calls within a single package is dictated by how they are fed into the compiler; the go tool orders files alphabetically. From then on, within a single file they are initialized in syntactic order. edited for word choice
                        – adityajones
                        Jun 20 '16 at 22:52
















                      • 3




                        Just my two cents: You could separate "simple init" from complex (panic-raising) initialization. If your're panicking at init(), you're giving no chance to the main program. Maybe a func initialize|loadConfig|connect separated from func init, leaving func init() for basic stuff (without panic). This separation also removes the need of the hack to ensure init order. Hope to be helpful.
                        – Lucio M. Tato
                        Mar 2 '15 at 12:52






                      • 3




                        Quote from the Language Specification: A package with no imports is initialized by assigning initial values to all its package-level variables followed by calling all init functions in the order they appear in the source, possibly in multiple files, as presented to the compiler. To ensure reproducible initialization behavior, build systems are encouraged to present multiple files belonging to the same package in lexical file name order to a compiler.
                        – updogliu
                        Aug 13 '15 at 23:41








                      • 1




                        The unfortunate thing I encountered in my application was that it didn't execute the init functions in lexical order. It may have been a compiler bug that has since been fixed. I didn't bother to check if there were any issues related to this.
                        – rifflock
                        Aug 15 '15 at 0:53






                      • 1




                        Important comment from updogliu above. This does not seem to hold true when imports are involved. Running into a case here where I have a test that relies on multiple imported packages. And the trick of using the package-level variables does not help me prevent init() methods on dependent packages being run before my variable assigned function.
                        – uncrase
                        Aug 24 '15 at 20:28






                      • 1




                        The ordering of the init() calls within a single package is dictated by how they are fed into the compiler; the go tool orders files alphabetically. From then on, within a single file they are initialized in syntactic order. edited for word choice
                        – adityajones
                        Jun 20 '16 at 22:52










                      3




                      3




                      Just my two cents: You could separate "simple init" from complex (panic-raising) initialization. If your're panicking at init(), you're giving no chance to the main program. Maybe a func initialize|loadConfig|connect separated from func init, leaving func init() for basic stuff (without panic). This separation also removes the need of the hack to ensure init order. Hope to be helpful.
                      – Lucio M. Tato
                      Mar 2 '15 at 12:52




                      Just my two cents: You could separate "simple init" from complex (panic-raising) initialization. If your're panicking at init(), you're giving no chance to the main program. Maybe a func initialize|loadConfig|connect separated from func init, leaving func init() for basic stuff (without panic). This separation also removes the need of the hack to ensure init order. Hope to be helpful.
                      – Lucio M. Tato
                      Mar 2 '15 at 12:52




                      3




                      3




                      Quote from the Language Specification: A package with no imports is initialized by assigning initial values to all its package-level variables followed by calling all init functions in the order they appear in the source, possibly in multiple files, as presented to the compiler. To ensure reproducible initialization behavior, build systems are encouraged to present multiple files belonging to the same package in lexical file name order to a compiler.
                      – updogliu
                      Aug 13 '15 at 23:41






                      Quote from the Language Specification: A package with no imports is initialized by assigning initial values to all its package-level variables followed by calling all init functions in the order they appear in the source, possibly in multiple files, as presented to the compiler. To ensure reproducible initialization behavior, build systems are encouraged to present multiple files belonging to the same package in lexical file name order to a compiler.
                      – updogliu
                      Aug 13 '15 at 23:41






                      1




                      1




                      The unfortunate thing I encountered in my application was that it didn't execute the init functions in lexical order. It may have been a compiler bug that has since been fixed. I didn't bother to check if there were any issues related to this.
                      – rifflock
                      Aug 15 '15 at 0:53




                      The unfortunate thing I encountered in my application was that it didn't execute the init functions in lexical order. It may have been a compiler bug that has since been fixed. I didn't bother to check if there were any issues related to this.
                      – rifflock
                      Aug 15 '15 at 0:53




                      1




                      1




                      Important comment from updogliu above. This does not seem to hold true when imports are involved. Running into a case here where I have a test that relies on multiple imported packages. And the trick of using the package-level variables does not help me prevent init() methods on dependent packages being run before my variable assigned function.
                      – uncrase
                      Aug 24 '15 at 20:28




                      Important comment from updogliu above. This does not seem to hold true when imports are involved. Running into a case here where I have a test that relies on multiple imported packages. And the trick of using the package-level variables does not help me prevent init() methods on dependent packages being run before my variable assigned function.
                      – uncrase
                      Aug 24 '15 at 20:28




                      1




                      1




                      The ordering of the init() calls within a single package is dictated by how they are fed into the compiler; the go tool orders files alphabetically. From then on, within a single file they are initialized in syntactic order. edited for word choice
                      – adityajones
                      Jun 20 '16 at 22:52






                      The ordering of the init() calls within a single package is dictated by how they are fed into the compiler; the go tool orders files alphabetically. From then on, within a single file they are initialized in syntactic order. edited for word choice
                      – adityajones
                      Jun 20 '16 at 22:52












                      up vote
                      5
                      down vote













                      Here is another example - https://github.com/alok87/gobyexample/blob/master/init/init.go



                      package main

                      import (
                      "fmt"
                      )

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

                      var test = callOut()

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

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

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

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


                      Output of the above program



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





                      share|improve this answer

























                        up vote
                        5
                        down vote













                        Here is another example - https://github.com/alok87/gobyexample/blob/master/init/init.go



                        package main

                        import (
                        "fmt"
                        )

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

                        var test = callOut()

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

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

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

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


                        Output of the above program



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





                        share|improve this answer























                          up vote
                          5
                          down vote










                          up vote
                          5
                          down vote









                          Here is another example - https://github.com/alok87/gobyexample/blob/master/init/init.go



                          package main

                          import (
                          "fmt"
                          )

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

                          var test = callOut()

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

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

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

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


                          Output of the above program



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





                          share|improve this answer












                          Here is another example - https://github.com/alok87/gobyexample/blob/master/init/init.go



                          package main

                          import (
                          "fmt"
                          )

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

                          var test = callOut()

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

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

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

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


                          Output of the above program



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






                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Sep 30 '17 at 17:16









                          Alok Kumar Singh

                          8217




                          8217






















                              up vote
                              4
                              down vote













                              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!






                              share|improve this answer

























                                up vote
                                4
                                down vote













                                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!






                                share|improve this answer























                                  up vote
                                  4
                                  down vote










                                  up vote
                                  4
                                  down vote









                                  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!






                                  share|improve this answer












                                  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!







                                  share|improve this answer












                                  share|improve this answer



                                  share|improve this answer










                                  answered Apr 11 '17 at 12:18









                                  kataras

                                  482312




                                  482312






















                                      up vote
                                      1
                                      down vote













                                      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.







                                      share|improve this answer

























                                        up vote
                                        1
                                        down vote













                                        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.







                                        share|improve this answer























                                          up vote
                                          1
                                          down vote










                                          up vote
                                          1
                                          down vote









                                          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.







                                          share|improve this answer












                                          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.








                                          share|improve this answer












                                          share|improve this answer



                                          share|improve this answer










                                          answered Feb 15 '17 at 22:58









                                          Schultz9999

                                          4,11563372




                                          4,11563372






















                                              up vote
                                              1
                                              down vote













                                              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.






                                              share|improve this answer



























                                                up vote
                                                1
                                                down vote













                                                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.






                                                share|improve this answer

























                                                  up vote
                                                  1
                                                  down vote










                                                  up vote
                                                  1
                                                  down vote









                                                  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.






                                                  share|improve this answer














                                                  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.







                                                  share|improve this answer














                                                  share|improve this answer



                                                  share|improve this answer








                                                  edited Mar 23 at 0:43

























                                                  answered Jun 16 '17 at 7:49









                                                  Xian Shu

                                                  35327




                                                  35327






















                                                      up vote
                                                      1
                                                      down vote













                                                      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







                                                      share|improve this answer

























                                                        up vote
                                                        1
                                                        down vote













                                                        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







                                                        share|improve this answer























                                                          up vote
                                                          1
                                                          down vote










                                                          up vote
                                                          1
                                                          down vote









                                                          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







                                                          share|improve this answer












                                                          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








                                                          share|improve this answer












                                                          share|improve this answer



                                                          share|improve this answer










                                                          answered Apr 4 at 8:10









                                                          Toky Liu

                                                          112




                                                          112






















                                                              up vote
                                                              0
                                                              down vote













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






                                                              share|improve this answer



























                                                                up vote
                                                                0
                                                                down vote













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






                                                                share|improve this answer

























                                                                  up vote
                                                                  0
                                                                  down vote










                                                                  up vote
                                                                  0
                                                                  down vote









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






                                                                  share|improve this answer














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







                                                                  share|improve this answer














                                                                  share|improve this answer



                                                                  share|improve this answer








                                                                  edited Jun 6 '17 at 11:15

























                                                                  answered Jun 6 '17 at 11:10









                                                                  harold ramos

                                                                  40346




                                                                  40346






























                                                                       

                                                                      draft saved


                                                                      draft discarded



















































                                                                       


                                                                      draft saved


                                                                      draft discarded














                                                                      StackExchange.ready(
                                                                      function () {
                                                                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f24790175%2fwhen-is-the-init-function-run%23new-answer', 'question_page');
                                                                      }
                                                                      );

                                                                      Post as a guest















                                                                      Required, but never shown





















































                                                                      Required, but never shown














                                                                      Required, but never shown












                                                                      Required, but never shown







                                                                      Required, but never shown

































                                                                      Required, but never shown














                                                                      Required, but never shown












                                                                      Required, but never shown







                                                                      Required, but never shown







                                                                      Popular posts from this blog

                                                                      Landwehr

                                                                      Reims

                                                                      Schenkenzell