2017-03-11 5 views
0

그래서 저는 최선의 방법이 무엇인지 궁금합니다. 나는 색상과 타임 스탬프 등으로 사용자 정의 로거를 사용하기 때문에 내가 여러 서브 패키지를 사용하여 응용 프로그램을Golang 패키지와 패키지간에 변수 사용하기

, 일부는

가 주입하여이를 달성하는 유일한 방법인가, 내가 메인 패키지에있는 로거에 액세스해야 그렇게 좋아하니?

type Handler struct { 
    logger logging.Logger 
} 

func NewHandler(logger logging.Logger) Handler { 
    return Handler{ 
     logger: logger, 
    } 
} 

handler := command.NewHandler(logger) 

나는이와 가지고이 문제는 내가 시험에 대한 로거를 조롱이 있기 때문에 테스트 성가신 될 것입니다 (처리기를 가정하면 서브 패키지 명령 호출에있다). 그래서 비동기 기능이나 경우 오류를 처리하는 방법을 나도 몰라 나는 기록하고 그들과 함께 주요 패키지 거래를하도록해야한다 다만 반환 오류에 대한 생각,하지만 난 그렇게

go handler.HandleMessage(msg) 

같은 일부 기능 비동기를 실행하고 싶습니다 그것조차 가능하다.

그래서 내가 원하는 것을 수행하는 것이 가장 좋습니다. 이에

답변

1

몇 가지 생각 : 자원 (로거)를 주입

  1. 는 내 의견으로는이 작업을 수행하는 가장 좋은 방법입니다. 전역 변수를 직접 참조하는 것은 가능하지만 코드를 변경하기가 어렵습니다.
  2. logging.Logger가 콘크리트 유형이면 nil 일 때 작동하게 만들 수 있으므로 테스트에서 초기화 작업을 건너 뛸 수 있습니다.
  3. 절대적으로 비동기 호출에서 오류를 처리 할 수 ​​있습니다. 당신은 내가 선호 한 후 먼저 전화를 호출 사이트에 의미있는 오류를 통과 할 경우

    go func() { 
         err := handler.HandleMessage(msg) 
         // err handling/logging here 
    }() 
    

    : 당신이 호출 사이트에서 추가 오류 처리를 추가하는 익명 함수를 사용하여이 지난 시점에

때마다 이것을하는 것. HandleMessage()에서 돌아 왔을 때 별도의 goroutine에서 실행 중임을 명심해야합니다.

+0

감사합니다. 익명의 함수는 좋은 생각입니다. 2에 대해 자세히 설명해 주시겠습니까? 나는 아무 것도 못 넘길 수 없다. "구체적인 유형"은 어떤 모습입니까? – gempir

+0

logging.Logger가 인터페이스 인 경우에는 호출을 수행하기 위해 NewHandler에 구현을 전달해야합니다. 반면에 Log()가있는 struct {} 일 경우 (log * Logger) Log (msg string) 함수에서 log == nil인지 여부를 확인할 수 있습니다. 즉, 빈 Logger (예 : Handler {} 작성)는 여전히 유효하므로 초기화 할 필요가 없습니다. –

+0

아, 그래 맞아. 제 경우에는 logging.Logger가 써드 파티 라이브러리의 인터페이스이기 때문에 래퍼를 써야합니다. – gempir