이 글은 Effective Go를 일부 번역한 글입니다.


이름

이름은 Go에서도 다른 언어와 마찬가지로 중요하다. 이름은 심지어 의미에 영향을 주기도 한다. 패키지 밖에서 이름을 보려면 첫 글자를 대문자로 해야 하기 때문이다. 그러니 Go 프로그램의 명명법에 대해 잠깐 이야기해보자.

패키지 이름

패키지를 불러오면 패키지 이름으로 그 내용을 다룰 수 있다.

import "bytes"

이렇게 패키지를 불러오면 bytes.Buffer를 다룰 수 있다. 패키지를 사용하는 모두가 같은 이름으로 내용을 참조할 수 있다면 도움이 될 것이며, 때문에 패키지 이름을 잘 지어야 한다. 짧고 간결하며, 연상할 만한 이름을 지으라. 관례에 따라 패키지를 소문자 한 단어로 이름한다. 밑줄이나 대문자를 섞을 필요가 없어야 한다. 패키지를 사용하는 모두가 그 이름을 입력해야 하니 지나치다 싶을 정도로 간결하게 지으라. 그리고 그로 인한 충돌을 걱정하지 말라. 패키지 이름은 패키지를 불러오기 위한 기본 이름일 뿐이다. 따라서 모든 소스 코드에 걸쳐 유일하지 않아도 되며, 드물게 충돌할 때도 불러온 패키지를 구역마다 다르게 이름할 수 있다. 패키지를 불러올 때 파일 이름은 사용할 패키지를 정할 뿐이기에 어쨌든 혼란스러울 일은 적다.

또 다른 규칙으로, 패키지 이름은 소스 디렉터리의 기본 이름(Basename)이다. src/encoding/base64에 있는 패키지를 불러올 땐 "encoding/base64”로 불러오지만 그 이름은 base64다. encoding_base64도 아니고 encodingBase64도 아니다.

패키지 사용자는 그 내용을 참조할 때 패키지 이름을 사용할 것이다. 그러니 이를 이용하면 패키지 밖으로 내보일 이름을 지을 때 중언부언하지 않을 수 있다. (import .을 사용하지 말라. 시험할 패키지 밖에서 실행해야 하는 시험을 단순하게 만들 수 있지만, 그런 경우가 아니라면 피하라.) 예를 들어, bufio 패키지의 Buffered Reader 유형(Type)은 BufReader가 아니라 쉽고 간결하게 Reader로 부른다. 사용자가 이를 bufio.Reader로 보기 때문이다. 게다가 불러온 항목을 항상 패키지 이름과 같이 쓰기 때문에 bufio.Reader가 io.Reader와 충돌하지도 않는다. 마찬가지로 ring.Ring의 새 발현체(Instance)를 만드는 함수(Go에선 이를 생성자(Constructor)라 부른다.)는 보통 NewRing으로 부르지만, 패키지 밖으로 노출한 유형이 Ring 하나뿐이고, 패키지 이름이 ring이기 때문에 이를 그냥 New로 부르며 사용자는 이를 ring.New로 접한다. 패키지 구조를 고려해 좋은 이름을 선택하라.

또 다른 짧은 예제는 once.Do다. once.Do(setup)는 이해하기 좋다. 하지만 once.DoOrWaitUntilDone(setup)으로 바꿔도 더 나아지진 않을 것이다. 이름이 길다고 자동으로 가독성이 좋아지는 건 아니다. 대개는 문서 주석을 잘 작성하는 게 유난히 긴 이름보다 더 중요할 것이다.