2016-07-29 2 views
3

에 한 번만 전역 변수를 설정 : 내가가 나는 main.go의이 파일이 golang

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

ConfigMap 형이 전역 변수 인이 다른 gofile에서

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

을, 매번 나는 시도 액세스 utils.ConfigMap지도는 GetAppConfig 함수가 호출됩니다. 앱이 초기화 된 다음이 프로젝트에서 원하는 모든 ConfigMap에 액세스하는 동안이 함수를 한 번만 호출하는 방법은 무엇입니까?

+0

init 함수에서 선언하는 법은 어떻습니까? –

답변

5

이것은 패키지 init() 기능입니다.

var ConfigMap map[string]string 

func init() { 
    // Init ConfigMap here 
} 

주를 동시 사용을 허용 할 경우 같은 수출 전역 변수는 보호되어야한다 : 패키지는 "외부에서"도달하기 전에 그들은 한 번 실행됩니다. 이것을 패키지 사용자에게 맡기는 것은 불가능합니다.

var configMap[string]string 

을 그리고 제대로 Mutex로 보호 할 것 게터 기능 제공 :이를 위해

, 당신은 ConfigMap이 안 export 선언해야

var confMux = &sync.Mutex{} 

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

그래서 go 파일에서 변수 선언 (초기화하지 않음)과 Config 함수를 사용합니까? 다른 파일의 configMap 변수에 액세스하려면 어떻게해야합니까? utils.configMap을 할 수 없다. – aaj

+0

@ love2code 예,이 경우에는'configMap'에 접근 할 수 없습니다. 그러나'Config()'함수로 모든 설정 값을 안전하게 쿼리 할 수 ​​있습니다. – icza

+0

응용 프로그램을 실행할 때 configMap이 완벽하게 초기화됩니다.그러나 나중에 config() 함수를 호출하는 동안 configMap을 인쇄하려고하면 함수가 비어 있습니다. – aaj

0

나는 오타가에있다 생각을 당신이 올린 코드. 이 같은 init 함수 외부 configMap을 정의 :

var configMap map[string]string 

이 잘하지만 초기화 안에 당신이 있습니다 : 당신이 configMap을 섀도 잉하는

다음
var configMap = map[string]string{} 

당신이 init 기능 밖에 가질 수 즉 변수가 다시 init 안에 선언 된 것입니다. 결과적으로 init 함수 외부의 변수에 액세스 할 때 여전히 비어있는 전역 변수를 가져옵니다. init 안에 var을 제거하면 정상적으로 작동합니다.

configMap = map[string]string{} 

Here's 빠른 데모. 원래의 질문에 다른 오타가

는 :

var configMap = GetAppConfig 

이 있어야한다 :

var configMap = GetAppConfig() 

당신은 함수의 변수보다는 결과에 기능을 할당한다.