Kapan fungsi init () dijalankan?

357

Saya sudah mencoba menemukan penjelasan yang tepat tentang apa init()fungsi tidak di Go. Saya membaca apa yang dikatakan Effective Go , tetapi saya tidak yakin apakah saya mengerti sepenuhnya apa yang dikatakannya. Kalimat persis yang saya tidak yakin adalah yang berikut:

Dan akhirnya berarti akhirnya: init dipanggil setelah semua deklarasi variabel dalam paket telah mengevaluasi inisialisasi mereka, dan itu dievaluasi hanya setelah semua paket impor diinisialisasi.

Apa all the variable declarations in the package have evaluated their initializersartinya Apakah ini berarti jika Anda mendeklarasikan variabel "global" dalam sebuah paket dan file-nya, init () tidak akan berjalan sampai semuanya dievaluasi dan kemudian akan menjalankan semua fungsi init dan kemudian main () ketika ./main_file_name dijalankan?

Saya juga membaca buku go Mark Summerfield sebagai berikut:

Jika suatu paket memiliki satu atau lebih fungsi init () mereka secara otomatis dieksekusi sebelum fungsi utama () paket utama dipanggil.

Dalam pemahaman saya, init()apakah hanya relevan ketika Anda menjalankan niat untuk menjalankan main () kan? atau paket Utama. Siapa pun yang mengerti lebih tepatnya init()merasa bebas untuk mengoreksi saya

Pinokio
sumber

Jawaban:

435

Ya dengan asumsi Anda memiliki ini :

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()dijamin berjalan sebelum init()dipanggil, dan init()dijamin berjalan sebelumnyamain() dipanggil.

Ingatlah bahwa init()selalu dipanggil, terlepas dari ada main atau tidak, jadi jika Anda mengimpor paket yang memiliki initfungsi, itu akan dieksekusi.

Selain itu, Anda dapat memiliki banyak init()fungsi per paket; mereka akan dieksekusi dalam urutan yang ditampilkan dalam file (setelah semua variabel diinisialisasi tentu saja). Jika mereka span beberapa file, mereka akan dieksekusi dalam urutan nama file leksikal (seperti yang ditunjukkan oleh @benc ):

Tampaknya init()fungsi dijalankan dalam urutan nama file leksikal. Go spec mengatakan "sistem build dianjurkan untuk menampilkan banyak file yang termasuk dalam paket yang sama dalam urutan nama file leksikal ke kompiler". Tampaknya go buildbekerja seperti ini.


Banyak paket Go internal digunakan init()untuk menginisialisasi tabel dan semacamnya, misalnya https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480

OneOfOne
sumber
1
init()adalah per paket hal, saya pikir ... Jadi, apakah itu berarti bahwa jika file yang berbeda memiliki sendiri inits, semua inints selalu dijalankan tepat sebelum main () dijalankan? Bisakah Anda juga menjelaskan untuk saya satu hal, mengapa Anda memiliki init () tanpa utama dan bagaimana cara kerjanya? Apakah ini berarti init () adalah hal terakhir yang berjalan sebelum paket diimpor? Kalau tidak, jika tidak diimpor dan tidak ada main, program tidak akan pernah menjalankan ... kan? (kecuali file tesnya saya kira ...)
Pinocchio
4
Ada banyak alasan untuk menjalankannya tanpa paket main, misalnya jika Anda perlu menginisialisasi beberapa variabel atau memuat beberapa file atau melakukan perhitungan satu kali. sekarang jika seluruh program Anda adalah satu paket yang tidak benar-benar diperlukan, namun jika beberapa paket, beberapa dari mereka mungkin perlu melakukan beberapa inisialisasi khusus untuk itu.
OneOfOne
4
@Pinocchio Akan selalu ada satu (dan hanya satu) main () ketika Anda menjalankan program go. Dan fungsi init () dijalankan sebelum yang utama (). Namun tidak semua paket memerlukan main (). Jika misalnya Anda membuat paket yang dapat digunakan kembali dengan fungsi utilitas untuk menghubungkan ke database, paket itu seharusnya tidak memiliki main (). Tetapi bisa memiliki init (). Ketika Anda menggunakan paket database itu dalam suatu program, program tersebut akan memiliki main ().
no.
Ilustrasi yang bagus initadalah dengan arsitektur pluggable, seperti dengan komandan Cobra . Perhatikan bagaimana initdireferensikan dalam contoh
Dan Esparza
1
@OneOfOne setelah beberapa tes, tampaknya fungsi init () dijalankan dalam urutan nama file leksikal. The Go Spec mengatakan "membangun sistem didorong untuk beberapa file ini milik paket yang sama di leksikal nama berkas untuk compiler". Tampaknya go build berfungsi seperti ini.
bangku
222

Lihat gambar ini. :)

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

  1. Jika suatu paket mengimpor paket lain, paket yang diimpor diinisialisasi terlebih dahulu.

  2. Konstanta paket saat ini diinisialisasi kemudian.

  3. Variabel paket saat ini diinisialisasi kemudian.

  4. Akhirnya, init()fungsi paket saat ini disebut.

Paket dapat memiliki beberapa fungsi init (baik dalam satu file atau didistribusikan di beberapa file) dan mereka dipanggil dalam urutan di mana mereka disajikan kepada kompiler.


Paket akan diinisialisasi hanya sekali bahkan jika itu diimpor dari beberapa paket.

menangis
sumber
3
Terima kasih untuk ini. Menambahkan beberapa teks masuk akal untuk diagram ini.
Balaji Boggaram Ramanarayan
1
Saya tidak begitu yakin bahwa kita dapat mengatakan bahwa konstanta diinisialisasi kemudian. Mereka diharapkan diketahui pada waktu kompilasi, bukan?
Alexis Wilke
Terima kasih untuk ini, gambar ini membantu saya dalam menyelesaikan masalah pembangunan besar, tetapi bisakah saya bertanya di mana sumber gambar ini?
Korede Lawrence Oluwafemi
1
@KoredeLawrenceOluwafemi Melihat tautan gambar, Anda akan menemukan bahwa itu dari sebuah buku yang ditulis oleh pendeta Go China github.com/astaxie
weaming
26

Sesuatu untuk ditambahkan ke ini (yang akan saya tambahkan sebagai komentar tetapi saat menulis posting ini saya belum cukup reputasi)

Memiliki banyak init dalam paket yang sama Saya belum menemukan cara yang dijamin untuk mengetahui urutan apa yang akan dijalankan. Misalnya saya punya:

package config
    - config.go
    - router.go

Keduanya config.godan router.goberisi init()fungsi, tetapi ketika menjalankan router.gofungsi berjalan terlebih dahulu (yang menyebabkan aplikasi saya panik).

Jika Anda berada dalam situasi di mana Anda memiliki banyak file, masing-masing dengan fungsinya sendiri init()menjadi sangat sadar bahwa Anda tidak dijamin mendapatkan satu sebelum yang lain. Lebih baik menggunakan tugas variabel seperti yang ditunjukkan OneToOne dalam contohnya. Bagian terbaiknya adalah: deklarasi variabel ini akan terjadi sebelum SEMUA init()fungsi dalam paket.

Sebagai contoh

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

terlepas dari apakah var ConfigSuccess = configureApplication()ada di router.goatau config.go, itu akan dijalankan sebelum BAIK init()dijalankan.

rifflock
sumber
3
Hanya dua sen saya: Anda dapat memisahkan "init sederhana" dari inisialisasi kompleks (panik). Jika Anda panik di init (), Anda tidak memberikan kesempatan ke program utama. Mungkin func initialize|loadConfig|connectterpisah dari func init, meninggalkan func init () untuk hal-hal dasar (tanpa panik). Pemisahan ini juga menghilangkan kebutuhan peretasan untuk memastikan urutannya. Semoga bermanfaat.
Lucio M. Tato
3
Kutipan dari Spesifikasi Bahasa: Paket tanpa impor diinisialisasi dengan menetapkan nilai awal untuk semua variabel tingkat paket diikuti dengan memanggil semua fungsi init dalam urutan mereka muncul di sumber, mungkin dalam beberapa file, sebagaimana disajikan ke kompiler. Untuk memastikan perilaku inisialisasi yang dapat direproduksi, sistem build dianjurkan untuk menyajikan banyak file yang termasuk dalam paket yang sama dalam urutan nama file leksikal ke kompiler.
updogliu
1
Hal yang disayangkan saya temui dalam aplikasi saya adalah bahwa ia tidak menjalankan fungsi init dalam urutan leksikal. Mungkin itu adalah kompiler bug yang telah diperbaiki. Saya tidak repot-repot memeriksa apakah ada masalah yang terkait dengan ini.
rifflock
1
Komentar penting dari updogliu di atas. Ini tampaknya tidak berlaku ketika impor terlibat. Menjalankan kasus di sini di mana saya memiliki tes yang bergantung pada beberapa paket yang diimpor. Dan trik menggunakan variabel level paket tidak membantu saya mencegah metode init () pada paket dependen dijalankan sebelum fungsi variabel saya ditugaskan.
Unrase
1
Pemesanan init()panggilan dalam satu paket ditentukan oleh bagaimana mereka dimasukkan ke dalam kompiler; yang goorder alat file abjad. Sejak saat itu, dalam satu file mereka diinisialisasi dalam urutan sintaksis. diedit untuk pilihan kata
adityajones
8

Berikut adalah contoh lain - 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 dari program di atas

$ go run init/init.go
Outside is being executed
Init3 is being executed
Init is being executed
Init2 is being executed
Do your thing !
Alok Kumar Singh
sumber
4

Ambil contoh kerangka kerja atau pustaka yang Anda desain untuk pengguna lain, pengguna ini pada akhirnya akan memiliki main functionkode mereka untuk menjalankan aplikasi mereka. Jika pengguna secara langsung mengimpor sub-paket proyek perpustakaan Anda, maka initsub-paket itu akan dipanggil ( sekali ) terlebih dahulu. Hal yang sama untuk paket root dari perpustakaan, dll ...

Ada banyak waktu di mana Anda mungkin ingin blok kode dieksekusi tanpa adanya main func, langsung atau tidak.

Jika Anda, sebagai pengembang perpustakaan imajiner, mengimpor sub-paket perpustakaan Anda yang memiliki initfungsi, itu akan dipanggil pertama dan sekali , Anda tidak memiliki main functetapi Anda perlu memastikan bahwa beberapa variabel, atau tabel, akan diinisialisasi sebelum panggilan fungsi lainnya.

Suatu hal yang baik untuk diingat dan tidak khawatir tentang, adalah bahwa: yang initselalu mengeksekusi sekali per aplikasi.

init eksekusi terjadi:

  1. tepat sebelum initfungsi paket "pemanggil",
  2. sebelum, secara opsional main func,,
  3. tetapi setelah variabel tingkat paket var = [...] or cost = [...],,

Saat Anda mengimpor paket, ia akan menjalankan semua fungsinya init, berdasarkan pesanan .

Saya akan memberikan contoh fungsi init yang sangat bagus. Ini akan menambahkan tipe mime ke pustaka go standar bernama mimedan fungsi level paket akan menggunakan mimepaket standar secara langsung untuk mendapatkan tipe mime khusus yang sudah diinisialisasi pada initfungsinya:

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
}

Harapan yang membantu Anda dan pengguna lain, jangan ragu untuk memposting lagi jika Anda memiliki pertanyaan lain!

kataras
sumber
2

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

Inisialisasi program berjalan dalam satu goroutine tunggal, tetapi goroutine itu dapat membuat goroutine lain, yang berjalan bersamaan.

Jika suatu paket p mengimpor paket q, penyelesaian fungsi init q terjadi sebelum dimulainya setiap p.

Awal fungsi main.main terjadi setelah semua fungsi init selesai.

Schultz9999
sumber
1

init akan dipanggil kemana saja menggunakan paketnya (tidak masalah impor kosong atau impor), tetapi hanya satu kali.

ini paket:

package demo

import (
    "some/logs"
)

var count int

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

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

paket apa pun (paket utama atau paket uji) impor sebagai kosong:

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

atau impor menggunakan func:

"printfcoder.com/we/models/demo"

func someFunc(){
   demo.Do()
}

init 0hanya akan mencatat satu kali. paket pertama yang menggunakannya, fungsi init akan berjalan sebelum paket init. Begitu:

A memanggil B, B memanggil C, semuanya memiliki fungsi init, init C akan dijalankan terlebih dahulu sebelum B, B sebelum A.

Xian Shu
sumber
1

fungsi mutil init dalam satu paket menjalankan perintah:

  1. jalankan fungsi const dan variabel yang ditentukan init ()

  2. fungsi init menjalankan order dengan nama file asc

Toky Liu
sumber
0

Fungsi init dijalankan pertama dan kemudian utama. Ini digunakan untuk mengatur sesuatu terlebih dahulu sebelum program Anda berjalan, misalnya:

Mengakses templat, Menjalankan program menggunakan semua inti, Memeriksa Goos dan lengkungan dll ...

harold ramos
sumber