최근 Go를 이용해 프로그래밍을 해보면서 신기한 경험을 많이하고 있다.

db를 초기화 해주는 init함수를 만들어 놓고 사용하는 코드를 집어넣지도 않았는데
db가 초기화가 되어있다. 그리고 다른 것 또한 잘돌아간다. main에다 init함수 호출하는
코드를 넣었더니 오류가 난다.


이게 무슨일이지 하고 검색해보니 func init()같은 함수를 만들게 될 경우 main함수 호출 이전에 같은 패키지 안에 있는 init함수들을 호출해준다.



위에처럼 package level의 변수들 같은 경우 선언과 함께 초기화 된다.

(단 자신이 초기화 하기위해 사용하는 변수들이 초기화 된 이후 초기화 된다.)

변수들을 dependency analysis를 통해 패키지 레벨 변수들은 아직 초기화가 안된 상황에서 초기화를 준비한다. 그리고 다른 변수에 dependency가 없는 것들을 먼저 초기화 해주고
그 다음 dependency가 있는 변수가 모두 초기화가 된 상황 이라면 dependency가 있는
변수를 초기화 한다. 위 소스는 d-b-c-a순서로 초기화를 한다.


이 이외에도 함수에 변수가 reference되어 있을 경우

static method에 대해 reference 되어있을경우도

이런 dependency check는 패키지 단위로 실행이 된다.


더 자세한건 http://golang.org/ref/spec#Package_initialization 여기 링크를 보면 된다


저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret