For the most part, Go developers are pretty good about using constants for global configuration, rather than global variables. A problem arises however when we want a global constant slice or map. The go compiler doesn't allow these more complex types to be set as constant. Many developers, upon making this realization, decide to then use a dangerous global variable. In this article we will explore a better option. A Brief Refresher on Globals and Constants package foo safeRateLimit = var dangerousRateLimit = // this is a global constant const 10 // this is a global variable 10 When setting configuration globals, which should be read-only, there is no reason to use a global variable. By using a variable instead of a constant you: Open up the potential for bugs when you or someone else accidentally mutates the value Confuse future developers who assume the value is supposed to change Most people already know this about global variables thankfully, and switching global variables to global constants is a fairly straightforward task. What If I Want A Global Slice or Map? Let's assume the following situation: We have a program that needs two sets of configurations. The configurations are: A list of supported social media networks A rate limit for making API calls to the networks (we assume they all have the same rate limit) Now that we know a bit about the configs we make the following decisions: Because these configurations will not change based on the environment the program is running in, rather than use environment variables we elect to set the values in code Since they are needed in many places in the app, , instead of passing them into 20+ functions we choose to scope them globally Because they should not change during the execution of the program, we decide to make them constant We then write the following code : main rateLimit = supportedNetworks = [] { , , } package const 10 const string "facebook" "twitter" "instagram" Much to our surprise, when we try to compile this code we get the following error: initializer []string literal is not a constant const Go doesn't allow complex types like slices and maps to be constant! Our first instinct may be to lazily switch it to a variable, and add a comment: main rateLimit = supportedNetworks = [] { , , } package const 10 // this is meant to be constant! Please don't mutate it! var string "facebook" "twitter" "instagram" Whenever we find ourselves leaving comments like this, we should be aware we are doing something . wrong The Better Solution It's much better to use an initializer function (not to be confused with Go's conventional init() function). An initializer function is a function that simply declares something and returns it. A good solution to our problem would be as follows: main rateLimit = { [] { , , } } package const 10 [] func getSupportedNetworks () string return string "facebook" "twitter" "instagram" Now, anywhere in the program we can use the result of and we know that there is no way we can get a mutated value. getSupportedNetworks() Thanks for reading! By Lane Wagner @wagslane Learn with Qvault: https://classroom.qvault.io Previously published at https://qvault.io/2019/10/21/how-to-global-constant-maps-and-slices-in-go/