Khi nào hàm init () chạy?


356

Tôi đã cố gắng tìm một lời giải thích chính xác về những gì init()chức năng làm trong Go. Tôi đã đọc những gì hiệu quả của Go nói nhưng tôi không chắc nếu tôi hiểu đầy đủ những gì nó nói. Câu chính xác tôi không chắc chắn là như sau:

Và cuối cùng có nghĩa là cuối cùng: init được gọi sau khi tất cả các khai báo biến trong gói đã đánh giá các bộ khởi tạo của chúng và chúng chỉ được đánh giá sau khi tất cả các gói đã nhập được khởi tạo.

all the variable declarations in the package have evaluated their initializersnghĩa là gì? Có nghĩa là nếu bạn khai báo các biến "toàn cầu" trong một gói và các tệp của nó, init () sẽ không chạy cho đến khi tất cả được đánh giá và sau đó nó sẽ chạy tất cả hàm init và sau đó là main () khi ./main_file_name được chạy?

Tôi cũng đọc cuốn sách của Mark Summerfield như sau:

Nếu một gói có một hoặc nhiều hàm init (), chúng sẽ tự động được thực thi trước khi hàm main () của gói chính được gọi.

Theo hiểu biết của tôi, init()chỉ có liên quan khi bạn chạy có ý định chạy main () phải không? hoặc gói chính. Bất cứ ai hiểu chính xác hơn init()cảm thấy tự do để sửa chữa tôi

Câu trả lời:


435

Có giả sử bạn có điều này :

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()được đảm bảo để chạy trước init()được gọi và init()được đảm bảo để chạy trước main()được gọi.

Hãy nhớ rằng init()luôn luôn được gọi, bất kể có chính hay không, vì vậy nếu bạn nhập gói có initchức năng, nó sẽ được thực thi.

Ngoài ra, bạn có thể có nhiều init()chức năng cho mỗi gói; chúng sẽ được thực hiện theo thứ tự chúng hiển thị trong tệp (sau khi tất cả các biến được khởi tạo tất nhiên). Nếu chúng mở rộng nhiều tệp, chúng sẽ được thực hiện theo thứ tự tên tệp từ vựng (như được chỉ ra bởi @benc ):

Có vẻ như các init()chức năng được thực hiện theo thứ tự tên tệp từ vựng. Thông số Go cho biết "các hệ thống xây dựng được khuyến khích trình bày nhiều tệp thuộc cùng một gói theo thứ tự tên tệp từ vựng cho trình biên dịch". Có vẻ như go buildhoạt động theo cách này.


Rất nhiều gói Go nội bộ sử dụng init()để khởi tạo các bảng và như vậy, ví dụ https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480


1
init()là một điều trên mỗi gói, tôi nghĩ ... Vì vậy, điều đó có nghĩa là nếu các tệp khác nhau có riêng inits, tất cả các gợi ý luôn được chạy ngay trước khi main () được chạy? Bạn cũng có thể làm rõ cho tôi một điều, tại sao bạn lại có init () mà không có main và nó hoạt động như thế nào? Có nghĩa là init () là thứ cuối cùng được chạy trước khi gói được nhập? Nếu không, nếu nó không được nhập và không có chính, chương trình sẽ không bao giờ thực thi ... đúng không? (trừ khi đó là tệp thử nghiệm tôi đoán ...)
Pinocchio

4
Có rất nhiều lý do để chạy init mà không có gói main, ví dụ nếu bạn cần khởi tạo một số biến hoặc tải một số tệp hoặc thực hiện tính toán một lần. bây giờ nếu toàn bộ chương trình của bạn là một gói không thực sự cần thiết, tuy nhiên nếu đó là nhiều gói, một số trong số chúng có thể cần thực hiện một số khởi tạo cụ thể cho gói đó.
OneOfOne

4
@Pinocchio Sẽ luôn có một (và chỉ một) main () khi bạn thực hiện chương trình đi. Và các hàm init () được chạy trước một hàm main (). Tuy nhiên, không phải tất cả các gói đều cần một hàm main (). Nếu ví dụ: bạn đang tạo gói có thể sử dụng lại với các chức năng tiện ích để kết nối với cơ sở dữ liệu, thì gói đó không nên có chính (). Nhưng nó có thể có một init (). Khi bạn sử dụng gói cơ sở dữ liệu đó trong một chương trình, chương trình sẽ có một hàm main ().
số

Một minh họa tốt initlà với một kiến ​​trúc có thể cắm được, giống như với chỉ huy Cobra . Lưu ý cách initđược tham chiếu trong các ví dụ
Dan Esparza

1
@OneOfOne sau một vài thử nghiệm, có vẻ như các hàm init () được thực thi theo thứ tự tên tệp từ vựng. Thông số Go cho biết "các hệ thống xây dựng được khuyến khích trình bày nhiều tệp thuộc cùng một gói theo thứ tự tên tệp từ vựng cho trình biên dịch". Có vẻ như đi xây dựng công trình theo cách này.
băng ghế

222

Xem hình này. :)

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

  1. Nếu một gói nhập các gói khác, các gói đã nhập được khởi tạo trước.

  2. Gói hiện tại được khởi tạo liên tục sau đó.

  3. Các biến hiện tại của gói được khởi tạo sau đó.

  4. Cuối cùng, init()chức năng của gói hiện tại được gọi.

Một gói có thể có nhiều hàm init (trong một tệp đơn hoặc được phân phối trên nhiều tệp) và chúng được gọi theo thứ tự mà chúng được trình bày cho trình biên dịch.


Một gói sẽ được khởi tạo chỉ một lần ngay cả khi nó được nhập từ nhiều gói.


3
Cám ơn vì cái này. Thêm một số văn bản có ý nghĩa cho sơ đồ này.
Balaji Boggaram Ramanarayan

1
Tôi không chắc chắn rằng chúng ta có thể nói các hằng số được khởi tạo sau đó. Họ dự kiến ​​sẽ được biết đến vào thời gian biên dịch, phải không?
Alexis Wilke

Cảm ơn vì điều này, hình ảnh này đã giúp tôi giải quyết một vấn đề xây dựng lớn, nhưng tôi có thể hỏi nguồn gốc của hình ảnh này ở đâu không?
Korede Lawrence Oluwafemi

1
@KoredeLawrenceOluwafemi Xem liên kết hình ảnh bạn sẽ thấy rằng đó là từ một cuốn sách được viết bởi một nhà thuyết giáo người Trung Quốc github.com/astaxie
weaming

26

Một cái gì đó để thêm vào điều này (mà tôi đã thêm vào như một bình luận nhưng thời gian viết bài này tôi chưa đủ danh tiếng)

Có nhiều đầu vào trong cùng một gói Tôi chưa tìm thấy bất kỳ cách nào được đảm bảo để biết thứ tự chúng sẽ được chạy. Ví dụ tôi có:

package config
    - config.go
    - router.go

Cả hai config.gorouter.gochứa các init()chức năng, nhưng khi chạy router.gochức năng của nó chạy trước (điều này khiến ứng dụng của tôi hoảng loạn).

Nếu bạn đang ở trong một tình huống mà bạn có nhiều tệp, mỗi tệp có init()chức năng riêng của mình, hãy lưu ý rằng bạn không được đảm bảo lấy tệp này trước tệp kia. Tốt hơn là sử dụng một phép gán biến như OneToOne hiển thị trong ví dụ của anh ấy. Phần tốt nhất là: Khai báo biến này sẽ xảy ra trước TẤT CẢ các init()hàm trong gói.

Ví dụ

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
}

bộ định tuyến

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

bất kể var ConfigSuccess = configureApplication()tồn tại trong router.gohay config.go, nó sẽ được chạy trước khi EITHER init()được chạy.


3
Chỉ hai xu của tôi: Bạn có thể tách "init đơn giản" khỏi khởi tạo phức tạp (gây hoảng loạn). Nếu bạn đang hoảng loạn tại init (), bạn sẽ không có cơ hội cho chương trình chính. Có thể func initialize|loadConfig|connecttách ra func init, để lại func init () cho những thứ cơ bản (không hoảng loạn). Sự tách biệt này cũng loại bỏ sự cần thiết của hack để đảm bảo trật tự init. Hy vọng sẽ hữu ích.
Lucio M. Tato

3
Trích dẫn từ Đặc tả ngôn ngữ: Một gói không nhập được khởi tạo bằng cách gán giá trị ban đầu cho tất cả các biến cấp gói của nó, sau đó gọi tất cả các hàm init theo thứ tự chúng xuất hiện trong nguồn, có thể trong nhiều tệp, như được trình bày cho trình biên dịch. Để đảm bảo hành vi khởi tạo có thể lặp lại, các hệ thống xây dựng được khuyến khích trình bày nhiều tệp thuộc cùng một gói theo thứ tự tên tệp từ vựng cho trình biên dịch.
updogliu

1
Điều đáng tiếc tôi gặp phải trong ứng dụng của mình là nó đã không thực thi các hàm init theo thứ tự từ vựng. Nó có thể là một lỗi biên dịch đã được sửa chữa. Tôi không buồn kiểm tra xem có vấn đề gì liên quan đến việc này không.
rifflock

1
Nhận xét quan trọng từ updogliu ở trên. Điều này dường như không đúng khi nhập khẩu có liên quan. Chạy vào một trường hợp ở đây nơi tôi có một bài kiểm tra dựa trên nhiều gói nhập khẩu. Và thủ thuật sử dụng các biến cấp gói không giúp tôi ngăn các phương thức init () trên các gói phụ thuộc được chạy trước hàm được gán biến của tôi.
khai báo

1
Thứ tự của các init()cuộc gọi trong một gói duy nhất được quyết định bởi cách chúng được đưa vào trình biên dịch; các gocông cụ sắp xếp các tập tin theo thứ tự abc. Từ đó trở đi, trong một tệp duy nhất chúng được khởi tạo theo thứ tự cú pháp. được chỉnh sửa để lựa chọn từ
adityajones

8

Đây là một ví dụ khác - 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 !")
}

Đầu ra của chương trình trên

$ 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

Lấy ví dụ một khung hoặc thư viện bạn đang thiết kế cho những người dùng khác, những người dùng này cuối cùng sẽ có một main functionmã trong mã của họ để thực thi ứng dụng của họ. Nếu người dùng nhập trực tiếp gói phụ của dự án thư viện của bạn thì initgói phụ đó sẽ được gọi ( một lần ) trước hết. Tương tự cho gói gốc của thư viện, v.v ...

Có nhiều lúc bạn có thể muốn một khối mã được thực thi mà không có sự tồn tại của a main func, trực tiếp hay không.

Nếu bạn, với tư cách là nhà phát triển thư viện tưởng tượng, nhập gói phụ của thư viện có initchức năng, nó sẽ được gọi đầu tiên và một lần , bạn không có main funcnhưng bạn cần đảm bảo rằng một số biến hoặc bảng, sẽ được khởi tạo trước các cuộc gọi của các chức năng khác.

Một điều tốt để ghi nhớ và không lo lắng về, đó là: sự initluôn luôn thực hiện một lần cho mỗi ứng dụng.

init thực hiện xảy ra:

  1. ngay trước initchức năng của gói "người gọi",
  2. trước, tùy chọn main func,
  3. nhưng sau các biến cấp gói , var = [...] or cost = [...].

Khi bạn nhập một gói, nó sẽ chạy tất cả các hàm init của nó, theo thứ tự .

Tôi sẽ đưa ra một ví dụ rất hay về hàm init. Nó sẽ thêm các loại mime vào thư viện của tiêu chuẩn có tên mimevà hàm cấp mimegói sẽ trực tiếp sử dụng gói tiêu chuẩn để lấy các loại mime tùy chỉnh đã được khởi tạo tại initchức năng của nó :

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
}

Hy vọng rằng đã giúp bạn và những người dùng khác, đừng ngần ngại đăng lại nếu bạn có thêm câu hỏi!


2

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

Khởi tạo chương trình chạy trong một con goroutine, nhưng con goroutine đó có thể tạo ra con goroutine khác, chạy đồng thời.

Nếu gói p nhập gói q, việc hoàn thành các hàm init của q xảy ra trước khi bắt đầu bất kỳ gói nào.

Sự bắt đầu của hàm main.main xảy ra sau khi tất cả các hàm init đã kết thúc.


1

init sẽ được gọi ở mọi nơi sử dụng gói của nó (không có vấn đề nhập hoặc nhập trống), nhưng chỉ một lần.

đây là một gói:

package demo

import (
    "some/logs"
)

var count int

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

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

bất kỳ gói nào (gói chính hoặc bất kỳ gói kiểm tra nào) đều nhập dưới dạng trống:

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

hoặc nhập nó bằng cách sử dụng nó func:

"printfcoder.com/we/models/demo"

func someFunc(){
   demo.Do()
}

init sẽ 0chỉ đăng nhập một lần. gói đầu tiên sử dụng nó, init func của nó sẽ chạy trước init của gói. Vì thế:

A gọi B, B gọi C, tất cả đều có init func, init của C sẽ được chạy trước B's, B's trước A's.


1

chức năng mutil init trong một lệnh thực hiện gói:

  1. const và biến định nghĩa tập tin hàm init () thực thi

  2. Hàm init thực hiện thứ tự theo tên tệp asc


0

Các init func chạy đầu tiên và sau đó là chính. Nó được sử dụng để thiết lập một cái gì đó trước khi chương trình của bạn chạy, ví dụ:

Truy cập một mẫu, Chạy chương trình bằng tất cả các lõi, Kiểm tra Goos và vòm, v.v ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.