init () 함수는 언제 실행됩니까?


356

init()Go 의 기능에 대한 정확한 설명을 찾으려고 노력했습니다 . Effective Go의 내용을 읽었 지만 내용을 완전히 이해했는지 확실하지 않았습니다. 확실하지 않은 정확한 문장은 다음과 같습니다.

그리고 마지막으로 최종적으로 의미합니다 : 패키지의 모든 변수 선언이 이니셜 라이저를 평가 한 후에 init가 호출되고 가져온 모든 패키지가 초기화 된 후에 만 ​​평가됩니다.

무슨 all the variable declarations in the package have evaluated their initializers뜻입니까? 패키지와 파일에 "전역"변수를 선언하면 init ()는 모든 평가가 끝날 때까지 실행되지 않고 ./main_file_name이 실행될 때 모든 init 함수를 실행 한 다음 main ()을 실행합니까?

또한 Mark Summerfield의 go book에서 다음을 읽습니다.

패키지에 하나 이상의 init () 함수가있는 경우 기본 패키지의 main () 함수가 호출되기 전에 자동으로 실행됩니다.

내 이해에서, init()당신이 실행할 때만 main ()을 올바르게 실행하려고합니까? 또는 메인 패키지. 누구든지 더 정확하게 이해 init()하면 나를 바로 고칠 수 있습니다.

답변:


434

예, 당신이 이것을 가지고 있다고 가정하면 :

var WhatIsThe = AnswerToLife()

func AnswerToLife() int {
    return 42
}

func init() {
    WhatIsThe = 0
}

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

AnswerToLife()init()호출 하기 전에 실행이 보장되고 호출 되기 전에 실행 init()이 보장됩니다 main().

명심 init()가 주요의 또는하지 않을 경우 당신은이 패키지 가져 오기 때문에 경우에 관계없이, 항상 호출 init기능, 그것은 실행됩니다.

또한 init()패키지 당 여러 기능을 가질 수 있습니다 . 파일에 표시된 순서대로 실행됩니다 (물론 모든 변수가 초기화 된 후). 파일이 여러 파일에 걸쳐 있으면 어휘 파일 이름 순서로 실행됩니다 ( @benc에 의해 지적 ).

init()함수는 어휘 파일 이름 순서로 실행되는 것 같습니다 . Go 스펙에 따르면 "빌드 시스템은 동일한 패키지에 속하는 여러 파일을 어휘 파일 이름 순서로 컴파일러에 제공하는 것이 좋습니다"라고 말합니다. go build이런 식으로 작동하는 것 같습니다 .


많은 내부 Go 패키지가 init()테이블 등을 초기화 하는 데 사용 합니다 (예 : https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480).


1
init()패키지 당 일이라고 생각합니다 ... 따라서 다른 파일에 자체 파일이있는 경우 initsmain ()이 실행되기 직전에 모든 inint가 항상 실행 된다는 것을 의미 합니까? 왜 한 가지를 분명히 해 줄 수 있습니까, 왜 메인이없는 init ()가 있고 어떻게 작동합니까? 패키지를 가져 오기 전에 init ()가 마지막으로 실행되었음을 의미합니까? 그렇지 않으면 가져 오지 않고 메인이 없으면 프로그램은 절대 실행되지 않습니다. (테스트 파일이 아니라면 ...)
Pinocchio

4
main예를 들어, 여러 변수를 초기화하거나 일부 파일을로드하거나 한 번 계산을 수행해야하는 경우 패키지없이 init를 실행해야하는 많은 이유가 있습니다 . 이제 전체 프로그램이 실제로 필요하지 않은 하나의 패키지이지만 여러 패키지 인 경우 일부 패키지는 특정 초기화를 수행해야 할 수 있습니다.
OneOfOne

4
@Pinocchio go 프로그램을 실행할 때 항상 하나의 main ()이 있습니다. 그리고 하나의 main () 전에 init () 함수가 실행됩니다. 그러나 모든 패키지에 main ()이 필요한 것은 아닙니다. 예를 들어 데이터베이스에 연결하기위한 유틸리티 함수를 사용하여 재사용 가능한 패키지를 만드는 경우 해당 패키지에는 main ()이 없어야합니다. 그러나 init ()를 가질 수 있습니다. 프로그램에서 해당 데이터베이스 패키지를 사용하면 프로그램에는 main ()이 있습니다.
nos

좋은 그림은 Cobra Commanderinit 와 같은 플러그 가능한 아키텍처 입니다. 예제에서 어떻게 참조 되는지init
Dan Esparza

1
몇 가지 테스트 후 @OneOfOne, 그것은 init () 함수는 어휘 파일 이름 순서로 실행되는 . 이동 사양은 "빌드 시스템은 컴파일러 어휘 파일 이름 순서로 같은 패키지에 속하는 존재하는 여러 파일을 권장한다"말했다. 빌드 가 이런 식으로 작동 하는 것 같습니다 .
벤치

221

이 사진을보십시오. :)

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

  1. 패키지가 다른 패키지를 가져 오면 가져온 패키지가 먼저 초기화됩니다.

  2. 그런 다음 현재 패키지의 상수가 초기화됩니다.

  3. 그런 다음 현재 패키지의 변수가 초기화됩니다.

  4. 마지막으로 init()현재 패키지의 기능이 호출됩니다.

패키지는 여러 개의 init 함수 (단일 파일로 또는 여러 파일로 분산)를 가질 수 있으며 컴파일러에 제시된 순서대로 호출됩니다.


패키지는 여러 패키지에서 가져온 경우에도 한 번만 초기화됩니다.


3
고마워 텍스트를 추가하면이 다이어그램에 적합합니다.
Balaji Boggaram Ramanarayan

1
상수가 초기화되었다고 말할 수 있는지 확실하지 않습니다. 컴파일 타임에 알려질 것으로 예상됩니다.
Alexis Wilke

감사합니다.이 이미지는 주요 빌드 문제를 해결하는 데 도움이되었지만이 이미지의 출처가 어디인지 물어볼 수 있습니까?
Korede Lawrence Oluwafemi

1
@KoredeLawrenceOluwafemi보기 당신은 그것에서 나온 것을 발견 할 것이다 이미지 링크 중국어로 이동 설교자에 의해 작성 github.com/astaxie
weaming

26

이것에 추가 할 내용 (댓글로 추가했지만이 게시물을 작성할 때 아직 평판이 충분하지 않습니다)

동일한 패키지에 여러 개의 inits가 있기 때문에 아직 어떤 순서로 실행할지 알 수있는 확실한 방법을 찾지 못했습니다. 예를 들어

package config
    - config.go
    - router.go

둘 다 포함하고 기능 config.gorouter.go포함 init()하지만 router.go의 기능을 실행하면 먼저 앱이 패닉 상태가되었습니다.

여러 파일이있는 상황에서 각각 자체 init()기능을 가진 파일은 다른 파일 보다 먼저 얻을 수 있다는 것을 잘 알고 있습니다. OneToOne이 예제에서 보여주는 것처럼 변수 할당을 사용하는 것이 좋습니다 . 가장 중요한 부분은 다음과 같습니다.이 변수 선언은 init()패키지의 모든 함수 보다 먼저 발생 합니다.

예를 들어

config.go :

var ConfigSuccess = configureApplication()

func init() {
    doSomething()
}

func configureApplication() bool {
    l4g.Info("Configuring application...")
    if valid := loadCommandLineFlags(); !valid {
        l4g.Critical("Failed to load Command Line Flags")
        return false
    }
    return true
}

router.go :

func init() {
    var (
        rwd string
        tmp string
        ok  bool
    )
    if metapath, ok := Config["fs"]["metapath"].(string); ok {
        var err error
        Conn, err = services.NewConnection(metapath + "/metadata.db")
        if err != nil {
            panic(err)
        }
    }
}

또는에 var ConfigSuccess = configureApplication()존재 하는지 여부에 관계없이 EITHER 가 실행 되기 전에 실행됩니다.router.goconfig.goinit()


3
내 두 센트 : "간단한 초기화"를 복잡한 (공황 제기) 초기화와 분리 할 수 ​​있습니다. init ()에서 당황하고 있다면 메인 프로그램에 기회가 없습니다. 에서 func initialize|loadConfig|connect분리되어 func init기본 항목에 대한 func init () (공황 제외)를 남겨 둡니다. 이 분리는 또한 초기화 순서를 보장하기 위해 해킹의 필요성을 제거합니다. 도움이 되길 바랍니다.
Lucio M. Tato

3
언어 사양의 인용문 : 가져 오기가없는 패키지는 모든 패키지 수준 변수에 초기 값을 할당 한 다음 컴파일러에 제시된대로 소스, 가능한 경우 여러 파일에 나타나는 순서대로 모든 init 함수를 호출하여 초기화됩니다. 재현 가능한 초기화 동작을 보장하기 위해 빌드 시스템은 동일한 패키지에 속하는 여러 파일을 어휘 파일 이름 순서로 컴파일러에 제시하는 것이 좋습니다.
updogliu

1
불행히도 내 응용 프로그램에서 마주 친 것은 init 함수를 어휘 순서로 실행하지 않았다는 것입니다. 이후 수정 된 컴파일러 버그 일 수 있습니다. 이와 관련된 문제가 있는지 확인하지 않았습니다.
rifflock

1
위 updogliu의 중요한 의견. 수입이 관련 될 때 이것은 사실이 아닌 것 같습니다. 가져온 여러 패키지에 의존하는 테스트가있는 경우가 있습니다. 그리고 패키지 수준 변수를 사용하는 트릭은 변수 할당 함수 전에 종속 패키지에 대한 init () 메서드가 실행되는 것을 방지하는 데 도움이되지 않습니다.
15:16

1
init()단일 패키지 내 에서 호출 순서는 호출이 컴파일러에 어떻게 공급되는지에 따라 결정됩니다. 이 go도구는 파일을 알파벳순으로 정렬합니다. 그런 다음 단일 파일 내에서 구문 순서로 초기화됩니다. 단어 선택을 위해 편집
adityajones

8

여기 또 다른 예가 있습니다 -https : //github.com/alok87/gobyexample/blob/master/init/init.go

package main

import (
    "fmt"
)

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

var test = callOut()

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

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

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

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

위 프로그램의 출력

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

4

예를 들어 다른 사용자를 위해 디자인하고있는 프레임 워크 나 라이브러리를 예로 들면,이 사용자는 결국 main function앱을 실행하기 위해 코드에 포함됩니다. 사용자가 라이브러리 프로젝트의 하위 패키지를 직접 가져 오면 먼저 해당 하위 패키지의 init하위 패키지가 호출됩니다 ( 한 번 ). 라이브러리의 루트 패키지와 동일합니다.

많은 시간이 있습니다 당신은 코드 블록이 실행되도록 할 수 있습니다 a의 존재없이 main func직접 여부는.

당신이 가상 라이브러리의 개발자와 같은이 라이브러리의 서브 패키지 가져 오는 경우 init함수를 먼저 호출하고 한 번 , 당신은이 없습니다main func 하지만 당신은 몇 가지 변수 또는 테이블에 있는지 확인해야합니다, 다른 함수를 호출하기 전에 초기화됩니다.

좋은 물건은 그것을 기억하지 걱정에,되는 : init항상 응용 프로그램 당 한 번 실행합니다.

init 실행이 발생합니다.

  1. init"caller"패키지 기능 직전 에
  2. 선택적으로 main func ,
  3. 패키지 수준 변수 다음 var = [...] or cost = [...]

패키지를 가져 오면 모든 초기화 기능이 순서대로 실행됩니다 .

init 함수에 대한 좋은 예를 보여 드리겠습니다. 이름이 지정된 표준 go의 라이브러리에 mime 유형을 추가 mime하고 패키지 레벨 함수는 mime표준 패키지를 직접 사용하여 해당 init함수 에서 이미 초기화 된 사용자 정의 mime 유형을 가져옵니다 .

package mime

import (
    "mime"
    "path/filepath"
)

var types = map[string]string{
    ".3dm":       "x-world/x-3dmf",
    ".3dmf":      "x-world/x-3dmf",
    ".7z":        "application/x-7z-compressed",
    ".a":         "application/octet-stream",
    ".aab":       "application/x-authorware-bin",
    ".aam":       "application/x-authorware-map",
    ".aas":       "application/x-authorware-seg",
    ".abc":       "text/vndabc",
    ".ace":       "application/x-ace-compressed",
    ".acgi":      "text/html",
    ".afl":       "video/animaflex",
    ".ai":        "application/postscript",
    ".aif":       "audio/aiff",
    ".aifc":      "audio/aiff",
    ".aiff":      "audio/aiff",
    ".aim":       "application/x-aim",
    ".aip":       "text/x-audiosoft-intra",
    ".alz":       "application/x-alz-compressed",
    ".ani":       "application/x-navi-animation",
    ".aos":       "application/x-nokia-9000-communicator-add-on-software",
    ".aps":       "application/mime",
    ".apk":       "application/vnd.android.package-archive",
    ".arc":       "application/x-arc-compressed",
    ".arj":       "application/arj",
    ".art":       "image/x-jg",
    ".asf":       "video/x-ms-asf",
    ".asm":       "text/x-asm",
    ".asp":       "text/asp",
    ".asx":       "application/x-mplayer2",
    ".au":        "audio/basic",
    ".avi":       "video/x-msvideo",
    ".avs":       "video/avs-video",
    ".bcpio":     "application/x-bcpio",
    ".bin":       "application/mac-binary",
    ".bmp":       "image/bmp",
    ".boo":       "application/book",
    ".book":      "application/book",
    ".boz":       "application/x-bzip2",
    ".bsh":       "application/x-bsh",
    ".bz2":       "application/x-bzip2",
    ".bz":        "application/x-bzip",
    ".c++":       "text/plain",
    ".c":         "text/x-c",
    ".cab":       "application/vnd.ms-cab-compressed",
    ".cat":       "application/vndms-pkiseccat",
    ".cc":        "text/x-c",
    ".ccad":      "application/clariscad",
    ".cco":       "application/x-cocoa",
    ".cdf":       "application/cdf",
    ".cer":       "application/pkix-cert",
    ".cha":       "application/x-chat",
    ".chat":      "application/x-chat",
    ".chrt":      "application/vnd.kde.kchart",
    ".class":     "application/java",
    ".com":       "text/plain",
    ".conf":      "text/plain",
    ".cpio":      "application/x-cpio",
    ".cpp":       "text/x-c",
    ".cpt":       "application/mac-compactpro",
    ".crl":       "application/pkcs-crl",
    ".crt":       "application/pkix-cert",
    ".crx":       "application/x-chrome-extension",
    ".csh":       "text/x-scriptcsh",
    ".css":       "text/css",
    ".csv":       "text/csv",
    ".cxx":       "text/plain",
    ".dar":       "application/x-dar",
    ".dcr":       "application/x-director",
    ".deb":       "application/x-debian-package",
    ".deepv":     "application/x-deepv",
    ".def":       "text/plain",
    ".der":       "application/x-x509-ca-cert",
    ".dif":       "video/x-dv",
    ".dir":       "application/x-director",
    ".divx":      "video/divx",
    ".dl":        "video/dl",
    ".dmg":       "application/x-apple-diskimage",
    ".doc":       "application/msword",
    ".dot":       "application/msword",
    ".dp":        "application/commonground",
    ".drw":       "application/drafting",
    ".dump":      "application/octet-stream",
    ".dv":        "video/x-dv",
    ".dvi":       "application/x-dvi",
    ".dwf":       "drawing/x-dwf=(old)",
    ".dwg":       "application/acad",
    ".dxf":       "application/dxf",
    ".dxr":       "application/x-director",
    ".el":        "text/x-scriptelisp",
    ".elc":       "application/x-bytecodeelisp=(compiled=elisp)",
    ".eml":       "message/rfc822",
    ".env":       "application/x-envoy",
    ".eps":       "application/postscript",
    ".es":        "application/x-esrehber",
    ".etx":       "text/x-setext",
    ".evy":       "application/envoy",
    ".exe":       "application/octet-stream",
    ".f77":       "text/x-fortran",
    ".f90":       "text/x-fortran",
    ".f":         "text/x-fortran",
    ".fdf":       "application/vndfdf",
    ".fif":       "application/fractals",
    ".fli":       "video/fli",
    ".flo":       "image/florian",
    ".flv":       "video/x-flv",
    ".flx":       "text/vndfmiflexstor",
    ".fmf":       "video/x-atomic3d-feature",
    ".for":       "text/x-fortran",
    ".fpx":       "image/vndfpx",
    ".frl":       "application/freeloader",
    ".funk":      "audio/make",
    ".g3":        "image/g3fax",
    ".g":         "text/plain",
    ".gif":       "image/gif",
    ".gl":        "video/gl",
    ".gsd":       "audio/x-gsm",
    ".gsm":       "audio/x-gsm",
    ".gsp":       "application/x-gsp",
    ".gss":       "application/x-gss",
    ".gtar":      "application/x-gtar",
    ".gz":        "application/x-compressed",
    ".gzip":      "application/x-gzip",
    ".h":         "text/x-h",
    ".hdf":       "application/x-hdf",
    ".help":      "application/x-helpfile",
    ".hgl":       "application/vndhp-hpgl",
    ".hh":        "text/x-h",
    ".hlb":       "text/x-script",
    ".hlp":       "application/hlp",
    ".hpg":       "application/vndhp-hpgl",
    ".hpgl":      "application/vndhp-hpgl",
    ".hqx":       "application/binhex",
    ".hta":       "application/hta",
    ".htc":       "text/x-component",
    ".htm":       "text/html",
    ".html":      "text/html",
    ".htmls":     "text/html",
    ".htt":       "text/webviewhtml",
    ".htx":       "text/html",
    ".ice":       "x-conference/x-cooltalk",
    ".ico":       "image/x-icon",
    ".ics":       "text/calendar",
    ".icz":       "text/calendar",
    ".idc":       "text/plain",
    ".ief":       "image/ief",
    ".iefs":      "image/ief",
    ".iges":      "application/iges",
    ".igs":       "application/iges",
    ".ima":       "application/x-ima",
    ".imap":      "application/x-httpd-imap",
    ".inf":       "application/inf",
    ".ins":       "application/x-internett-signup",
    ".ip":        "application/x-ip2",
    ".isu":       "video/x-isvideo",
    ".it":        "audio/it",
    ".iv":        "application/x-inventor",
    ".ivr":       "i-world/i-vrml",
    ".ivy":       "application/x-livescreen",
    ".jam":       "audio/x-jam",
    ".jav":       "text/x-java-source",
    ".java":      "text/x-java-source",
    ".jcm":       "application/x-java-commerce",
    ".jfif-tbnl": "image/jpeg",
    ".jfif":      "image/jpeg",
    ".jnlp":      "application/x-java-jnlp-file",
    ".jpe":       "image/jpeg",
    ".jpeg":      "image/jpeg",
    ".jpg":       "image/jpeg",
    ".jps":       "image/x-jps",
    ".js":        "application/javascript",
    ".json":      "application/json",
    ".jut":       "image/jutvision",
    ".kar":       "audio/midi",
    ".karbon":    "application/vnd.kde.karbon",
    ".kfo":       "application/vnd.kde.kformula",
    ".flw":       "application/vnd.kde.kivio",
    ".kml":       "application/vnd.google-earth.kml+xml",
    ".kmz":       "application/vnd.google-earth.kmz",
    ".kon":       "application/vnd.kde.kontour",
    ".kpr":       "application/vnd.kde.kpresenter",
    ".kpt":       "application/vnd.kde.kpresenter",
    ".ksp":       "application/vnd.kde.kspread",
    ".kwd":       "application/vnd.kde.kword",
    ".kwt":       "application/vnd.kde.kword",
    ".ksh":       "text/x-scriptksh",
    ".la":        "audio/nspaudio",
    ".lam":       "audio/x-liveaudio",
    ".latex":     "application/x-latex",
    ".lha":       "application/lha",
    ".lhx":       "application/octet-stream",
    ".list":      "text/plain",
    ".lma":       "audio/nspaudio",
    ".log":       "text/plain",
    ".lsp":       "text/x-scriptlisp",
    ".lst":       "text/plain",
    ".lsx":       "text/x-la-asf",
    ".ltx":       "application/x-latex",
    ".lzh":       "application/octet-stream",
    ".lzx":       "application/lzx",
    ".m1v":       "video/mpeg",
    ".m2a":       "audio/mpeg",
    ".m2v":       "video/mpeg",
    ".m3u":       "audio/x-mpegurl",
    ".m":         "text/x-m",
    ".man":       "application/x-troff-man",
    ".manifest":  "text/cache-manifest",
    ".map":       "application/x-navimap",
    ".mar":       "text/plain",
    ".mbd":       "application/mbedlet",
    ".mc$":       "application/x-magic-cap-package-10",
    ".mcd":       "application/mcad",
    ".mcf":       "text/mcf",
    ".mcp":       "application/netmc",
    ".me":        "application/x-troff-me",
    ".mht":       "message/rfc822",
    ".mhtml":     "message/rfc822",
    ".mid":       "application/x-midi",
    ".midi":      "application/x-midi",
    ".mif":       "application/x-frame",
    ".mime":      "message/rfc822",
    ".mjf":       "audio/x-vndaudioexplosionmjuicemediafile",
    ".mjpg":      "video/x-motion-jpeg",
    ".mm":        "application/base64",
    ".mme":       "application/base64",
    ".mod":       "audio/mod",
    ".moov":      "video/quicktime",
    ".mov":       "video/quicktime",
    ".movie":     "video/x-sgi-movie",
    ".mp2":       "audio/mpeg",
    ".mp3":       "audio/mpeg3",
    ".mp4":       "video/mp4",
    ".mpa":       "audio/mpeg",
    ".mpc":       "application/x-project",
    ".mpe":       "video/mpeg",
    ".mpeg":      "video/mpeg",
    ".mpg":       "video/mpeg",
    ".mpga":      "audio/mpeg",
    ".mpp":       "application/vndms-project",
    ".mpt":       "application/x-project",
    ".mpv":       "application/x-project",
    ".mpx":       "application/x-project",
    ".mrc":       "application/marc",
    ".ms":        "application/x-troff-ms",
    ".mv":        "video/x-sgi-movie",
    ".my":        "audio/make",
    ".mzz":       "application/x-vndaudioexplosionmzz",
    ".nap":       "image/naplps",
    ".naplps":    "image/naplps",
    ".nc":        "application/x-netcdf",
    ".ncm":       "application/vndnokiaconfiguration-message",
    ".nif":       "image/x-niff",
    ".niff":      "image/x-niff",
    ".nix":       "application/x-mix-transfer",
    ".nsc":       "application/x-conference",
    ".nvd":       "application/x-navidoc",
    ".o":         "application/octet-stream",
    ".oda":       "application/oda",
    ".odb":       "application/vnd.oasis.opendocument.database",
    ".odc":       "application/vnd.oasis.opendocument.chart",
    ".odf":       "application/vnd.oasis.opendocument.formula",
    ".odg":       "application/vnd.oasis.opendocument.graphics",
    ".odi":       "application/vnd.oasis.opendocument.image",
    ".odm":       "application/vnd.oasis.opendocument.text-master",
    ".odp":       "application/vnd.oasis.opendocument.presentation",
    ".ods":       "application/vnd.oasis.opendocument.spreadsheet",
    ".odt":       "application/vnd.oasis.opendocument.text",
    ".oga":       "audio/ogg",
    ".ogg":       "audio/ogg",
    ".ogv":       "video/ogg",
    ".omc":       "application/x-omc",
    ".omcd":      "application/x-omcdatamaker",
    ".omcr":      "application/x-omcregerator",
    ".otc":       "application/vnd.oasis.opendocument.chart-template",
    ".otf":       "application/vnd.oasis.opendocument.formula-template",
    ".otg":       "application/vnd.oasis.opendocument.graphics-template",
    ".oth":       "application/vnd.oasis.opendocument.text-web",
    ".oti":       "application/vnd.oasis.opendocument.image-template",
    ".otm":       "application/vnd.oasis.opendocument.text-master",
    ".otp":       "application/vnd.oasis.opendocument.presentation-template",
    ".ots":       "application/vnd.oasis.opendocument.spreadsheet-template",
    ".ott":       "application/vnd.oasis.opendocument.text-template",
    ".p10":       "application/pkcs10",
    ".p12":       "application/pkcs-12",
    ".p7a":       "application/x-pkcs7-signature",
    ".p7c":       "application/pkcs7-mime",
    ".p7m":       "application/pkcs7-mime",
    ".p7r":       "application/x-pkcs7-certreqresp",
    ".p7s":       "application/pkcs7-signature",
    ".p":         "text/x-pascal",
    ".part":      "application/pro_eng",
    ".pas":       "text/pascal",
    ".pbm":       "image/x-portable-bitmap",
    ".pcl":       "application/vndhp-pcl",
    ".pct":       "image/x-pict",
    ".pcx":       "image/x-pcx",
    ".pdb":       "chemical/x-pdb",
    ".pdf":       "application/pdf",
    ".pfunk":     "audio/make",
    ".pgm":       "image/x-portable-graymap",
    ".pic":       "image/pict",
    ".pict":      "image/pict",
    ".pkg":       "application/x-newton-compatible-pkg",
    ".pko":       "application/vndms-pkipko",
    ".pl":        "text/x-scriptperl",
    ".plx":       "application/x-pixclscript",
    ".pm4":       "application/x-pagemaker",
    ".pm5":       "application/x-pagemaker",
    ".pm":        "text/x-scriptperl-module",
    ".png":       "image/png",
    ".pnm":       "application/x-portable-anymap",
    ".pot":       "application/mspowerpoint",
    ".pov":       "model/x-pov",
    ".ppa":       "application/vndms-powerpoint",
    ".ppm":       "image/x-portable-pixmap",
    ".pps":       "application/mspowerpoint",
    ".ppt":       "application/mspowerpoint",
    ".ppz":       "application/mspowerpoint",
    ".pre":       "application/x-freelance",
    ".prt":       "application/pro_eng",
    ".ps":        "application/postscript",
    ".psd":       "application/octet-stream",
    ".pvu":       "paleovu/x-pv",
    ".pwz":       "application/vndms-powerpoint",
    ".py":        "text/x-scriptphyton",
    ".pyc":       "application/x-bytecodepython",
    ".qcp":       "audio/vndqcelp",
    ".qd3":       "x-world/x-3dmf",
    ".qd3d":      "x-world/x-3dmf",
    ".qif":       "image/x-quicktime",
    ".qt":        "video/quicktime",
    ".qtc":       "video/x-qtc",
    ".qti":       "image/x-quicktime",
    ".qtif":      "image/x-quicktime",
    ".ra":        "audio/x-pn-realaudio",
    ".ram":       "audio/x-pn-realaudio",
    ".rar":       "application/x-rar-compressed",
    ".ras":       "application/x-cmu-raster",
    ".rast":      "image/cmu-raster",
    ".rexx":      "text/x-scriptrexx",
    ".rf":        "image/vndrn-realflash",
    ".rgb":       "image/x-rgb",
    ".rm":        "application/vndrn-realmedia",
    ".rmi":       "audio/mid",
    ".rmm":       "audio/x-pn-realaudio",
    ".rmp":       "audio/x-pn-realaudio",
    ".rng":       "application/ringing-tones",
    ".rnx":       "application/vndrn-realplayer",
    ".roff":      "application/x-troff",
    ".rp":        "image/vndrn-realpix",
    ".rpm":       "audio/x-pn-realaudio-plugin",
    ".rt":        "text/vndrn-realtext",
    ".rtf":       "text/richtext",
    ".rtx":       "text/richtext",
    ".rv":        "video/vndrn-realvideo",
    ".s":         "text/x-asm",
    ".s3m":       "audio/s3m",
    ".s7z":       "application/x-7z-compressed",
    ".saveme":    "application/octet-stream",
    ".sbk":       "application/x-tbook",
    ".scm":       "text/x-scriptscheme",
    ".sdml":      "text/plain",
    ".sdp":       "application/sdp",
    ".sdr":       "application/sounder",
    ".sea":       "application/sea",
    ".set":       "application/set",
    ".sgm":       "text/x-sgml",
    ".sgml":      "text/x-sgml",
    ".sh":        "text/x-scriptsh",
    ".shar":      "application/x-bsh",
    ".shtml":     "text/x-server-parsed-html",
    ".sid":       "audio/x-psid",
    ".skd":       "application/x-koan",
    ".skm":       "application/x-koan",
    ".skp":       "application/x-koan",
    ".skt":       "application/x-koan",
    ".sit":       "application/x-stuffit",
    ".sitx":      "application/x-stuffitx",
    ".sl":        "application/x-seelogo",
    ".smi":       "application/smil",
    ".smil":      "application/smil",
    ".snd":       "audio/basic",
    ".sol":       "application/solids",
    ".spc":       "text/x-speech",
    ".spl":       "application/futuresplash",
    ".spr":       "application/x-sprite",
    ".sprite":    "application/x-sprite",
    ".spx":       "audio/ogg",
    ".src":       "application/x-wais-source",
    ".ssi":       "text/x-server-parsed-html",
    ".ssm":       "application/streamingmedia",
    ".sst":       "application/vndms-pkicertstore",
    ".step":      "application/step",
    ".stl":       "application/sla",
    ".stp":       "application/step",
    ".sv4cpio":   "application/x-sv4cpio",
    ".sv4crc":    "application/x-sv4crc",
    ".svf":       "image/vnddwg",
    ".svg":       "image/svg+xml",
    ".svr":       "application/x-world",
    ".swf":       "application/x-shockwave-flash",
    ".t":         "application/x-troff",
    ".talk":      "text/x-speech",
    ".tar":       "application/x-tar",
    ".tbk":       "application/toolbook",
    ".tcl":       "text/x-scripttcl",
    ".tcsh":      "text/x-scripttcsh",
    ".tex":       "application/x-tex",
    ".texi":      "application/x-texinfo",
    ".texinfo":   "application/x-texinfo",
    ".text":      "text/plain",
    ".tgz":       "application/gnutar",
    ".tif":       "image/tiff",
    ".tiff":      "image/tiff",
    ".tr":        "application/x-troff",
    ".tsi":       "audio/tsp-audio",
    ".tsp":       "application/dsptype",
    ".tsv":       "text/tab-separated-values",
    ".turbot":    "image/florian",
    ".txt":       "text/plain",
    ".uil":       "text/x-uil",
    ".uni":       "text/uri-list",
    ".unis":      "text/uri-list",
    ".unv":       "application/i-deas",
    ".uri":       "text/uri-list",
    ".uris":      "text/uri-list",
    ".ustar":     "application/x-ustar",
    ".uu":        "text/x-uuencode",
    ".uue":       "text/x-uuencode",
    ".vcd":       "application/x-cdlink",
    ".vcf":       "text/x-vcard",
    ".vcard":     "text/x-vcard",
    ".vcs":       "text/x-vcalendar",
    ".vda":       "application/vda",
    ".vdo":       "video/vdo",
    ".vew":       "application/groupwise",
    ".viv":       "video/vivo",
    ".vivo":      "video/vivo",
    ".vmd":       "application/vocaltec-media-desc",
    ".vmf":       "application/vocaltec-media-file",
    ".voc":       "audio/voc",
    ".vos":       "video/vosaic",
    ".vox":       "audio/voxware",
    ".vqe":       "audio/x-twinvq-plugin",
    ".vqf":       "audio/x-twinvq",
    ".vql":       "audio/x-twinvq-plugin",
    ".vrml":      "application/x-vrml",
    ".vrt":       "x-world/x-vrt",
    ".vsd":       "application/x-visio",
    ".vst":       "application/x-visio",
    ".vsw":       "application/x-visio",
    ".w60":       "application/wordperfect60",
    ".w61":       "application/wordperfect61",
    ".w6w":       "application/msword",
    ".wav":       "audio/wav",
    ".wb1":       "application/x-qpro",
    ".wbmp":      "image/vnd.wap.wbmp",
    ".web":       "application/vndxara",
    ".wiz":       "application/msword",
    ".wk1":       "application/x-123",
    ".wmf":       "windows/metafile",
    ".wml":       "text/vnd.wap.wml",
    ".wmlc":      "application/vnd.wap.wmlc",
    ".wmls":      "text/vnd.wap.wmlscript",
    ".wmlsc":     "application/vnd.wap.wmlscriptc",
    ".word":      "application/msword",
    ".wp5":       "application/wordperfect",
    ".wp6":       "application/wordperfect",
    ".wp":        "application/wordperfect",
    ".wpd":       "application/wordperfect",
    ".wq1":       "application/x-lotus",
    ".wri":       "application/mswrite",
    ".wrl":       "application/x-world",
    ".wrz":       "model/vrml",
    ".wsc":       "text/scriplet",
    ".wsrc":      "application/x-wais-source",
    ".wtk":       "application/x-wintalk",
    ".x-png":     "image/png",
    ".xbm":       "image/x-xbitmap",
    ".xdr":       "video/x-amt-demorun",
    ".xgz":       "xgl/drawing",
    ".xif":       "image/vndxiff",
    ".xl":        "application/excel",
    ".xla":       "application/excel",
    ".xlb":       "application/excel",
    ".xlc":       "application/excel",
    ".xld":       "application/excel",
    ".xlk":       "application/excel",
    ".xll":       "application/excel",
    ".xlm":       "application/excel",
    ".xls":       "application/excel",
    ".xlt":       "application/excel",
    ".xlv":       "application/excel",
    ".xlw":       "application/excel",
    ".xm":        "audio/xm",
    ".xml":       "text/xml",
    ".xmz":       "xgl/movie",
    ".xpix":      "application/x-vndls-xpix",
    ".xpm":       "image/x-xpixmap",
    ".xsr":       "video/x-amt-showrun",
    ".xwd":       "image/x-xwd",
    ".xyz":       "chemical/x-pdb",
    ".z":         "application/x-compress",
    ".zip":       "application/zip",
    ".zoo":       "application/octet-stream",
    ".zsh":       "text/x-scriptzsh",
    ".docx":      "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
    ".docm":      "application/vnd.ms-word.document.macroEnabled.12",
    ".dotx":      "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
    ".dotm":      "application/vnd.ms-word.template.macroEnabled.12",
    ".xlsx":      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    ".xlsm":      "application/vnd.ms-excel.sheet.macroEnabled.12",
    ".xltx":      "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
    ".xltm":      "application/vnd.ms-excel.template.macroEnabled.12",
    ".xlsb":      "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
    ".xlam":      "application/vnd.ms-excel.addin.macroEnabled.12",
    ".pptx":      "application/vnd.openxmlformats-officedocument.presentationml.presentation",
    ".pptm":      "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
    ".ppsx":      "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
    ".ppsm":      "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
    ".potx":      "application/vnd.openxmlformats-officedocument.presentationml.template",
    ".potm":      "application/vnd.ms-powerpoint.template.macroEnabled.12",
    ".ppam":      "application/vnd.ms-powerpoint.addin.macroEnabled.12",
    ".sldx":      "application/vnd.openxmlformats-officedocument.presentationml.slide",
    ".sldm":      "application/vnd.ms-powerpoint.slide.macroEnabled.12",
    ".thmx":      "application/vnd.ms-officetheme",
    ".onetoc":    "application/onenote",
    ".onetoc2":   "application/onenote",
    ".onetmp":    "application/onenote",
    ".onepkg":    "application/onenote",
    ".xpi":       "application/x-xpinstall",
}

func init() {
    for ext, typ := range types {
        // skip errors
        mime.AddExtensionType(ext, typ)
    }
}

// typeByExtension returns the MIME type associated with the file extension ext.
// The extension ext should begin with a leading dot, as in ".html".
// When ext has no associated type, typeByExtension returns "".
//
// Extensions are looked up first case-sensitively, then case-insensitively.
//
// The built-in table is small but on unix it is augmented by the local
// system's mime.types file(s) if available under one or more of these
// names:
//
//   /etc/mime.types
//   /etc/apache2/mime.types
//   /etc/apache/mime.types
//
// On Windows, MIME types are extracted from the registry.
//
// Text types have the charset parameter set to "utf-8" by default.
func TypeByExtension(fullfilename string) string {
    ext := filepath.Ext(fullfilename)
    typ := mime.TypeByExtension(ext)

    // mime.TypeByExtension returns as text/plain; | charset=utf-8 the static .js (not always)
    if ext == ".js" && (typ == "text/plain" || typ == "text/plain; charset=utf-8") {

        if ext == ".js" {
            typ = "application/javascript"
        }
    }
    return typ
}

귀하와 다른 사용자에게 도움이 되었기를 바랍니다. 궁금한 점이 있으면 언제든지 다시 게시 해주세요.


2

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

프로그램 초기화는 단일 goroutine에서 실행되지만 해당 goroutine은 동시에 실행되는 다른 고 루틴을 생성 할 수 있습니다.

패키지 p가 패키지 q를 가져 오는 경우, p의 시작 전에 q의 init 함수 완료가 발생합니다.

main.main 함수의 시작은 모든 초기화 함수가 완료된 후에 발생합니다.


1

init 빈 가져 오기 또는 가져 오기에 관계없이 패키지를 사용하는 모든 곳에서 한 번만 호출됩니다.

이것은 패키지입니다 :

package demo

import (
    "some/logs"
)

var count int

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

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

모든 패키지 (주 패키지 또는 테스트 패키지)는 빈칸으로 가져옵니다.

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

또는 func을 사용하여 가져 오십시오.

"printfcoder.com/we/models/demo"

func someFunc(){
   demo.Do()
}

init는 0한 번만 기록 합니다. 그것을 사용하는 첫 번째 패키지 인 init func는 패키지의 init 전에 실행됩니다. 그래서:

A는 B를 호출하고 B는 C를 호출하며 모두 초기화 기능을 가지고 있으며 C의 초기화는 B보다 먼저 실행되고 B는 A보다 먼저 실행됩니다.


1

하나의 패키지에서 mutil init 함수는 다음 순서대로 실행됩니다.

  1. const 및 변수 정의 파일 init () 함수 실행

  2. 파일 이름 asc에 의해 init 함수 실행 순서


0

init func가 먼저 실행 된 다음 main이 실행됩니다. 다음과 같이 프로그램이 실행되기 전에 먼저 설정하는 데 사용됩니다.

템플릿 액세스, 모든 코어를 사용하여 프로그램 실행, Goos 및 아치 확인 등 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.