İnit () işlevi ne zaman çalışır?


357

init()Go fonksiyonunda ne yaptığına dair kesin bir açıklama bulmaya çalıştım . Effective Go'nun söylediklerini okudum ama ne dediğini tam olarak anladığımdan emin değildim. Emin olmadığım cümle şudur:

Ve son olarak, şu anlama gelir: init, paketteki tüm değişken bildirimler başlatıcılarını değerlendirdikten sonra çağrılır ve bunlar yalnızca içe aktarılan tüm paketler başlatıldıktan sonra değerlendirilir.

Ne anlama all the variable declarations in the package have evaluated their initializersgeliyor? Bir paketteki ve dosyalarındaki "global" değişkenleri bildirirseniz, init () öğesi tüm değerlendirilene kadar çalışmayacak ve sonra tüm init işlevini ve ./main_file_name çalıştırıldığında main () çalıştıracak mı?

Ayrıca Mark Summerfield'ın şu kitabı da okudum:

Bir paketin bir veya daha fazla init () işlevi varsa, bunlar ana paketin main () işlevi çağrılmadan önce otomatik olarak yürütülür.

Anladığım kadarıyla, init()sadece main () 'ı çalıştırma niyetinde çalıştığınız zaman geçerli mi? veya Ana paket. init()Beni daha iyi anlayan herkes beni düzeltmekten çekinmeyin

Yanıtlar:


435

Evet, buna sahip olduğunuzu varsayarsak :

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()daha önce çalıştırılması garanti edilir init()ve init()daha önce çalıştırılması garanti edilir main().

Unutmayın init()orada ana ya da değil eğer bir sahip bir paket içe eğer öyleyse, ne olursa olsun, her zaman denir initişlevini, bu çalıştırılacaktır.

Ayrıca, init()paket başına birden fazla fonksiyonunuz olabilir ; bunlar dosyada göründükleri sırayla yürütülür (tüm değişkenler elbette başlatıldıktan sonra). Birden çok dosyaya yayılmışlarsa, sözlü dosya adı sırasıyla ( @benc tarafından belirtildiği gibi ) yürütülür :

Görünüşe göre init()işlevler sözcüksel dosya adı sırasıyla yürütülmektedir. Go spec "derleme sistemleri aynı pakete ait birden fazla dosyayı bir derleyiciye sözlüksel dosya adı sırasında sunmaya teşvik edilir" diyor. go buildBu şekilde çalışıyor gibi görünüyor .


Dahili Go paketlerinin çoğu init()tabloları ve benzerlerini başlatmak için kullanır , örneğin https://github.com/golang/go/blob/883bc6/src/compress/bzip2/bzip2.go#L480


1
init()sanırım paket başına bir şeydir ... Yani, farklı dosyalar kendi varsa inits, tüm inints her zaman main () çalıştırılmadan hemen önce çalıştırıldığı anlamına mı geliyor? Benim için bir şeyi açıklığa kavuşturabilir misin, neden ana olmadan bir init () elde edersiniz ve bu nasıl çalışır? Paket içe aktarılmadan önce yapılan son şey init () anlamına mı geliyor? Aksi takdirde, eğer ithal edilmezse ve ana yoksa, program asla yürütülmez ... değil mi? (sanırım bir test dosyası değilse ...)
Pinokyo

4
Init'i paket olmadan çalıştırmak için birçok neden vardır, mainörneğin birkaç değişkeni başlatmanız veya bazı dosyaları yüklemeniz veya bir kerelik hesaplamalar yapmanız gerekiyorsa. şimdi tüm programınız gerçekten gerekli olmayan tek bir paketse, ancak birden fazla paketse, bazılarının buna özgü bazı başlatmalar yapması gerekebilir.
OneOfOne

4
@Pinocchio Bir go programı yürüttüğünüzde her zaman bir (ve yalnızca bir) main () olacaktır. Ve init () işlevleri bir main () öğesinden önce çalıştırılır. Ancak, tüm paketlerde main () gerekmez. Örneğin, bir veritabanına bağlanmak için yardımcı program işlevlerine sahip yeniden kullanılabilir bir paket oluşturuyorsanız, bu paketin main () öğesine sahip olmaması gerekir. Ancak bir init () içerebilir. Bu veritabanı paketini bir programda kullandığınızda, program bir main () yöntemine sahip olacaktır.
nos

İyi bir örnek, Cobra komutanıinit gibi takılabilir bir mimariye sahip . Örneklerde nasıl referansta bulunduğuna dikkat edininit
Dan Esparza

1
@OneOfOne birkaç testten sonra, init () işlevlerinin sözlüksel dosya adı sırasında yürütüldüğü görülmektedir. Git Spec "inşa sistemleri derleyici sözcük dosya adı için aynı pakete ait mevcut birden fazla dosya için teşvik edilir" diyor. Görünüşe göre go build bu şekilde çalışıyor.
tezgah

222

Bu resme bakın. :)

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

  1. Bir paket diğer paketleri içe aktarırsa, önce içe aktarılan paketler başlatılır.

  2. Geçerli paketin sabiti başlatıldı.

  3. Geçerli paketin değişkenleri daha sonra başlatılır.

  4. Son olarak, init()mevcut paketin işlevi çağrılır.

Bir paketin birden fazla başlatma işlevi olabilir (tek bir dosyada veya birden çok dosyaya dağıtılmış) ve bunlar derleyiciye sunuldukları sırayla çağrılır.


Bir paket, birden fazla paketten içe aktarılsa bile yalnızca bir kez başlatılır.


3
Bunun için teşekkürler. Biraz metin eklemek bu şemaya mantıklı geliyor.
Balaji Boggaram Ramanarayan

1
Sabitlerin başlatıldığını söyleyebileceğimizden pek emin değilim. Derleme zamanında bilinmeleri bekleniyor, değil mi?
Alexis Wilke

Bunun için teşekkürler, bu görüntü büyük bir derleme problemini çözmeme yardımcı oldu, ancak bu görüntünün kaynağının nerede olduğunu sorabilir miyim?
Korede Lawrence Oluwafemi

1
@KoredeLawrenceOluwafemi Bir Çin Go vaizi github.com/astaxie
weaming

26

Buna eklemek için bir şey (ki yorum olarak eklerdim ama bu yazıyı yazarken henüz yeterince itibar görmedim)

Aynı pakette birden fazla girişe sahip olmak için hangi sırayla çalıştırılacağını bilmenin herhangi bir garanti yolunu bulamadım. Örneğin:

package config
    - config.go
    - router.go

Hem config.gove router.goihtiva init()fonksiyonları, ama çalıştırırken router.go'ın fonksiyonunu (benim app panik neden olan) ilk koştu.

Birden fazla dosyanızın olduğu bir durumdaysanız, her birinin kendi init()işlevi vardır , birbirinden önce almanızın garanti edilmediğinin çok farkında olun. OneToOne'un örneğinde gösterdiği gibi, değişken bir atama kullanmak daha iyidir . En iyi bölüm: Bu değişken bildirimi init(), paketteki TÜM işlevlerden önce gerçekleşir .

Örneğin

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

bakılmaksızın arasında var ConfigSuccess = configureApplication()var olan router.goveya config.goBİRİ önce, bu çalışma olacaktır init()çalıştırılır.


3
Sadece iki sentim: "Basit başlangıcı" karmaşık (panik yaratan) başlatmadan ayırabilirsiniz. İnit () 'de panik yapıyorsanız, ana programa şansınız yoktur. Belki func initialize|loadConfig|connectayrılan func init(panik olmadan) temel şeyler için fonk init () bırakarak. Bu ayırma işlemi, saldırı sırasını sağlamak için bilgisayar korsanlığı ihtiyacını da ortadan kaldırır. Yardımcı olmayı umuyoruz.
Lucio M. Tato

3
Dil Spesifikasyonundan Alıntı: İçe aktarımı olmayan bir paket, paket düzeyindeki tüm değişkenlere başlangıç ​​değerleri atayarak ve derleyiciye sunulduğu gibi, tüm init işlevlerini kaynakta göründükleri sırayla çağırılarak başlatılır. Tekrarlanabilir başlatma davranışını sağlamak için, derleme sistemleri aynı pakete ait birden fazla dosyayı sözlü dosya adı düzeninde bir derleyiciye sunmaya teşvik edilir.
updogliu

1
Uygulamamda karşılaştığım talihsiz şey, init işlevlerini sözcüksel sırayla yürütmediğiydi. O zamandan beri düzeltilmiş bir derleyici hatası olabilir. Bununla ilgili herhangi bir sorun olup olmadığını kontrol etmek için uğraşmadı.
rifflock

1
Yukarıdaki updogliu önemli yorum. İthalatlar söz konusu olduğunda bu doğru görünmüyor. Burada birden fazla içe aktarılan pakete dayanan bir test yaptığım bir davaya giriyorum. Paket düzeyi değişkenlerini kullanmanın hilesi, bağımlı paketlerdeki init () yöntemlerinin değişken atanan işlevimden önce çalıştırılmasını önlememe yardımcı olmaz.
uncrase

1
init()Çağrıların tek bir pakette sıralanması derleyiciye nasıl beslendiklerine göre belirlenir; goaracı siparişleri alfabetik dosyaları. O andan itibaren, tek bir dosya içinde sözdizimsel sırayla başlatılırlar. kelime seçimi için düzenlendi
adityajones

8

İşte başka bir örnek - 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 !")
}

Yukarıdaki programın çıktısı

$ 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

Örneğin, diğer kullanıcılar için tasarladığınız bir çerçeveyi veya kütüphaneyi ele alalım, bu kullanıcılar sonunda main functionuygulamalarını yürütmek için kodlarında bir olacaktır . Kullanıcı doğrudan kütüphanenizin projesinin bir alt paketini içe aktarırsa, inito alt paketin ilk önce (bir kez ) çağrılır . Kütüphanenin kök paketi için de aynısı ...

Bir kod bloğunun a main funcveya doğrudan olmadan yürütülmesini istediğiniz birçok kez vardır .

Hayali kitaplığın geliştiricisi olarak, kitaplığınızın bir initişlevi olan alt paketini içe aktarırsanız, ilk ve bir kez çağrılır , bir sahip olmazsınız, main funcancak bazı değişkenlerin veya bir tablonun, diğer işlevlerin çağrılarından önce başlatılır.

İyi bir şey olduğunu hatırlamak değil yaklaşık endişelendirmeyecek olduğu için: Her zaman uygulama için bir kereliğine yürütün.init

init yürütme gerçekleşir:

  1. init"arayan" paketinin işlevinden hemen önce ,
  2. isteğe bağlı olarak main func,
  3. ancak paket düzeyindeki değişkenlerden sonra var = [...] or cost = [...],

Bir paketi içe aktardığınızda, tüm init işlevlerini sırayla çalıştırır .

Bir init fonksiyonuna çok iyi bir örnek vereceğim. Adında standart bir go'nun kitaplığına mime türleri ekler mimeve paket düzeyinde bir işlev, işlevinde mimezaten başlatılmış olan özel mime türlerini almak için doğrudan standart paketi kullanır init:

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
}

Umarım size ve diğer kullanıcılara yardımcı olur, daha fazla sorunuz varsa tekrar göndermekten çekinmeyin!


2

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

Programın başlatılması tek bir goroutinde çalışır, ancak o gorout aynı anda çalışan başka goroutinler oluşturabilir.

Bir p paketi q paketini içeri aktarırsa, q'nun init işlevlerinin tamamlanması, p'lerin herhangi birinin başlamasından önce gerçekleşir.

Main.main işlevinin başlangıcı tüm init işlevleri tamamlandıktan sonra gerçekleşir.


1

init her yerde çağrılır paketini kullanır (boş alma veya alma fark etmez), ancak sadece bir kez.

bu bir paket:

package demo

import (
    "some/logs"
)

var count int

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

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

herhangi bir paket (ana paket veya herhangi bir test paketi) boş olarak içe aktarın:

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

veya func kullanarak içe aktarın:

"printfcoder.com/we/models/demo"

func someFunc(){
   demo.Do()
}

init 0yalnızca bir kez günlüğe kaydedilir . bunu kullanan ilk paket, init işlevi paketin başlangıcından önce çalışır. Yani:

B, B çağrıları C çağırır, hepsinde init fonk vardır, C'nin init B'den önce, B A'dan önce çalıştırılır.


1

mutil init işlevi bir pakette yürütme sırası:

  1. const ve değişken tanımlı dosya init () işlevi yürütmek

  2. init işlevi asc dosya adıyla yürütme sırası


0

İnit işlevi önce ve sonra ana olarak çalışır. Programınız çalıştırmadan önce bir şey ayarlamak için kullanılır, örneğin:

Bir şablona erişme, tüm çekirdekleri kullanarak programı çalıştırma, Goos ve kemeri kontrol etme vb.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.