Pertanyaan Tetapkan variabel global hanya sekali dalam golang


Saya memiliki file main.go yang memiliki:

// running the router in port 9000
func main() {
    router := routers.InitApp()
    router.RunTLS(":9000" , "domain.crt" , "domain.key")
}

Dalam gofile lain yang saya miliki

package utils
var ConfigMap = GetAppConfig
func GetAppConfig() map[string]string{
 ....//
}

ConfigMap menjadi variabel global, setiap kali saya mencoba mengakses utils.ConfigMap petakan GetAppConfig fungsi disebut. Bagaimana saya bisa memanggil fungsi ini hanya sekali saat oleh aplikasi menginisialisasi dan kemudian mengakses Anyehere ConfigMap yang saya inginkan dalam proyek go.


4
2017-07-29 11:00


asal


Jawaban:


Ini paket apa init() fungsi untuk. Mereka dieksekusi sekali, sebelum paket Anda dapat dihubungi "dari luar":

var ConfigMap map[string]string

func init() {
    // Init ConfigMap here
}

Perhatikan bahwa variabel global yang diekspor tersebut harus dilindungi jika Anda ingin mengizinkan penggunaan bersamaan. Akan tidak layak untuk menyerahkan ini kepada pengguna paket.

Untuk tujuan ini, Anda harus menyatakan ConfigMap tidak terekspor:

var configMap[string]string

Dan memberikan fungsi pengambil yang akan melindunginya dengan benar Mutex:

var confMux = &sync.Mutex{}

func Config(name string) string {
    confMux.Lock()
    defer confMux.Unlock()
    return configMap[name]
}

9
2017-07-29 11:03



Saya yakin ada salah ketik dalam kode yang Anda posting. Anda mendefinisikan configMap di luar fungsi init seperti ini:

var configMap map[string]string

Ini bagus tapi di dalam init Anda juga memiliki ini:

var configMap = map[string]string{}

Di sini Anda membayangi configMap yang Anda miliki di luar init fungsi yang berarti bahwa Anda telah mendeklarasikan variabel lagi di dalam init. Akibatnya ketika Anda mengakses variabel di luar init berfungsi Anda akan mendapatkan variabel global yang masih kosong. Jika Anda menghapus var di dalam init itu akan berfungsi dengan baik.

configMap = map[string]string{}

Ini demonstrasi cepat.

Ada kesalahan ketik lain dalam pertanyaan asli:

var configMap = GetAppConfig

Ini harus:

var configMap = GetAppConfig()

Anda menetapkan fungsi ke suatu variabel daripada hasil dari fungsi.


0
2017-07-30 02:11