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 initializers
artinya 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
init()
adalah per paket hal, saya pikir ... Jadi, apakah itu berarti bahwa jika file yang berbeda memiliki sendiriinits
, 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 ...)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.init
adalah dengan arsitektur pluggable, seperti dengan komandan Cobra . Perhatikan bagaimanainit
direferensikan dalam contohLihat gambar ini. :)
import --> const --> var --> init()
Jika suatu paket mengimpor paket lain, paket yang diimpor diinisialisasi terlebih dahulu.
Konstanta paket saat ini diinisialisasi kemudian.
Variabel paket saat ini diinisialisasi kemudian.
Akhirnya,
init()
fungsi paket saat ini disebut.sumber
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:
Keduanya
config.go
danrouter.go
berisiinit()
fungsi, tetapi ketika menjalankanrouter.go
fungsi 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 SEMUAinit()
fungsi dalam paket.Sebagai contoh
config.go:
router.go:
terlepas dari apakah
var ConfigSuccess = configureApplication()
ada dirouter.go
atauconfig.go
, itu akan dijalankan sebelum BAIKinit()
dijalankan.sumber
func initialize|loadConfig|connect
terpisah darifunc init
, meninggalkan func init () untuk hal-hal dasar (tanpa panik). Pemisahan ini juga menghilangkan kebutuhan peretasan untuk memastikan urutannya. Semoga bermanfaat.init()
panggilan dalam satu paket ditentukan oleh bagaimana mereka dimasukkan ke dalam kompiler; yanggo
order alat file abjad. Sejak saat itu, dalam satu file mereka diinisialisasi dalam urutan sintaksis. diedit untuk pilihan kataBerikut adalah contoh lain - https://github.com/alok87/gobyexample/blob/master/init/init.go
Output dari program di atas
sumber
Ambil contoh kerangka kerja atau pustaka yang Anda desain untuk pengguna lain, pengguna ini pada akhirnya akan memiliki
main function
kode mereka untuk menjalankan aplikasi mereka. Jika pengguna secara langsung mengimpor sub-paket proyek perpustakaan Anda, makainit
sub-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
init
fungsi, itu akan dipanggil pertama dan sekali , Anda tidak memilikimain func
tetapi 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
init
selalu mengeksekusi sekali per aplikasi.init
eksekusi terjadi:init
fungsi paket "pemanggil",main func
,,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
mime
dan fungsi level paket akan menggunakanmime
paket standar secara langsung untuk mendapatkan tipe mime khusus yang sudah diinisialisasi padainit
fungsinya:Harapan yang membantu Anda dan pengguna lain, jangan ragu untuk memposting lagi jika Anda memiliki pertanyaan lain!
sumber
https://golang.org/ref/mem#tmp_4
sumber
init
akan dipanggil kemana saja menggunakan paketnya (tidak masalah impor kosong atau impor), tetapi hanya satu kali.ini paket:
paket apa pun (paket utama atau paket uji) impor sebagai kosong:
atau impor menggunakan func:
init
0
hanya 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.
sumber
fungsi mutil init dalam satu paket menjalankan perintah:
jalankan fungsi const dan variabel yang ditentukan init ()
fungsi init menjalankan order dengan nama file asc
sumber
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 ...
sumber