Go, CamelCase 또는 Semi-CamelCase에서 함수 이름을 지정하는 방법은 무엇입니까?


80

Go에서 MongoDB 데이터베이스의 컬렉션에 문서를 삽입하는 함수를 작성하고 싶습니다. 함수 이름을 지정하는 것이 더 낫습니다.

  • writeToMongoDB 또는
  • WriteToMongoD?

두 번째는 CamelCase인데 첫 번째 스타일을 사용하는 사람을 보았 기 때문에 어느 것이 더 적합한 지 잘 모르겠습니다. 감사.


2
그들은 다른 용도가 : golang.org/ref/spec#Exported_identifiers
JimB

감사. 파일 A의 다른 프로그램에서 함수는 첫 번째 방식으로 이름이 지정되고 파일 B의 다른 프로그램은 파일 A에서 함수를 호출합니다. 파일 A와 B는 모두 동일한 디렉토리에 있습니다. 링크에 따르면 다른 파일에서 프로그램이 사용하려면 함수를 두 번째 방법으로 정의해야하는 것 같습니다. 맞습니까?
Tim

즉, 파일 A의 패키지 이름이 packageA이면 파일 B는 packageA.WriteToMongoD(packageA가 한정자로 필요함)을 사용하여 함수에 액세스 할 수 있습니다 .
Tanmay Garg

답변:


116

통사론

Go에서 이것은 스타일의 문제가 아니라 구문의 문제입니다.

내 보낸 이름 (즉, 정의 된 패키지 이외의 패키지에서 사용할 수있는 식별자)은 대문자로 시작합니다. 따라서 메서드가 공용 API의 일부인 경우 다음과 같이 작성해야합니다.

WriteToDB

그러나 내부 도우미 메서드 인 경우 다음과 같이 작성해야합니다.

writeToDB

이러한 방식으로 키워드를 사용하여 내보내기 ( extern, public등) 를 정의하는 것보다 이점은 식별자를 이름의 일부로 만들면 식별자가 사용되는 위치를 찾을 필요없이 내보낼 지 여부를 알 수 있다는 것입니다. 정의되었습니다 (정의에 키워드가 포함되어 있는지 확인).

또한보십시오: 사양에서 내 보낸 식별자 .

i18n

Go는 UTF-8로 인코딩되고 식별자 이름에 문자 또는 숫자 속성이있는 모든 유니 코드 문자를 지원하기 때문에 대소 문자 개념이없는 로캘의 일부 사용자는 내 보낸 메서드를 만드는 데 문제가있을 수 있습니다 (기본값은 내보내기되지 않음). 이 경우 (말장난 의도) X수출을 표시 하기 위해 식별자에 접두사를 붙이는 것이 일반적 입니다. 예를 들면 :X日本語

참조 : 유니 코드 식별자에 무슨 일이 있습니까? FAQ에서.

스타일

일반적인 스타일에 관한 한, 항상 카멜 케이스를 사용하는 것입니다 (앞에서 언급 한 첫 글자 제외). 여기에는 상수, 함수 및 기타 식별자가 포함됩니다. 예를 들어 (내 보낸) 상수 목록은 다음과 같습니다.

const (
    StateConnected = iota
    StateError
    StateDone

    internalStateMask = 0x2 
)

또한 약어는 항상 동일한 대소 문자로 작성되므로 다음 중 하나를 작성합니다.

dbWrite
writeDB

writeDb또는 대신 DbWrite.


좋은 답변 +1. 선호되는 Go 용어는 CamelCase가 아닌 MixedCaps 또는 mixedCaps입니다. golang.org/doc/effective_go.html#mixed-caps를 참조 하세요 .
Tom L

28

Go에서는 혼합 캡을 사용하는 것이 관례입니다. 문서에서 : https://golang.org/doc/effective_go.html#mixed-caps

마지막으로 Go의 규칙은 여러 단어로 된 이름을 작성하기 위해 밑줄 대신 MixedCaps 또는 mixedCaps를 사용하는 것입니다.

대문자로 시작하는 파일 수준 이름은 패키지 수준에서 내보내집니다. https://golang.org/doc/effective_go.html#Getters

또한 모두 대문자로 두문자어를 쓰는 것이 관례입니다. 그래서 아래는 괜찮습니다.

writeToMongoDB // unexported, only visible within the package

또는

WriteToMongoDB // exported

그리고 아닙니다 :

writeToMongoDb

골랭을 배우고 며칠 동안이 문제에 갇혀있었습니다. 드디어 해결했습니다!
AzyCrw4282

18

이름

Go에서 이름은 다른 언어만큼이나 중요합니다. 의미 론적 효과도 있습니다 . 패키지 외부의 이름의 가시성은 첫 번째 문자가 대문자인지 여부에 따라 결정됩니다 . 따라서 Go 프로그램의 명명 규칙에 대해 이야기하는 데 시간을 할애 할 가치가 있습니다.

패키지 이름

패키지를 가져 오면 패키지 이름이 콘텐츠에 대한 접근자가됩니다. 후

import "bytes"가져 오는 패키지는 bytes.Buffer에 대해 말할 수 있습니다. 패키지를 사용하는 모든 사람이 동일한 이름을 사용하여 내용을 참조 할 수 있다면 유용합니다. 즉, 패키지 이름이 짧고, 간결하고, 연상되어야 함을 의미합니다. 관례 적으로 패키지에는 소문자, 단일 단어 이름이 지정됩니다. 밑줄이나 mixedCaps는 필요하지 않습니다.. 패키지를 사용하는 모든 사람이 그 이름을 입력 할 것이기 때문에 간결한 측면에서 오류가 발생합니다. 그리고 충돌에 대해 선험적으로 걱정하지 마십시오. 패키지 이름은 가져 오기의 기본 이름 일뿐입니다. 모든 소스 코드에서 고유 할 필요는 없으며 드물게 충돌이 발생하는 경우 가져 오는 패키지가 로컬에서 사용할 다른 이름을 선택할 수 있습니다. 어쨌든 가져 오기의 파일 이름이 사용중인 패키지를 결정하기 때문에 혼동이 거의 없습니다.

또 다른 규칙은 패키지 이름이 소스 디렉토리의 기본 이름이라는 것입니다. src / encoding / base64의 패키지는 "encoding / base64"로 가져 오지만 이름은 encoding_base64가 아니라 encodingBase64가 아닙니다.

패키지의 임포터는 내용을 참조하기 위해 이름을 사용하므로 패키지의 내 보낸 이름은이 사실을 사용하여 버벅 거림을 방지 할 수 있습니다. (테스트중인 패키지 외부에서 실행해야하는 테스트를 단순화 할 수있는 import. 표기법을 사용하지 마십시오. 그렇지 않으면 피해야합니다.) 예를 들어 bufio 패키지의 버퍼링 된 판독기 유형은 BufReader가 아니라 Reader라고합니다. 사용자는이를 명확하고 간결한 이름 인 bufio.Reader로 간주합니다. 또한 가져온 엔터티는 항상 패키지 이름으로 주소가 지정되므로 bufio.Reader는 io.Reader와 충돌하지 않습니다. 마찬가지로, Go에서 생성자의 정의 인 ring.Ring의 새 인스턴스를 만드는 함수는 일반적으로 NewRing이라고합니다. 그러나 Ring은 패키지에서 내 보낸 유일한 유형이고 패키지를 ring이라고하므로 ' 패키지의 클라이언트가 ring.New. 패키지 구조를 사용하면 좋은 이름을 선택하는 데 도움이됩니다.

또 다른 간단한 예는 once.Do; once.Do (setup)은 잘 읽고 한 번 작성해도 개선되지 않습니다 .DoOrWaitUntilDone (setup). 긴 이름은 자동으로 내용을 더 읽기 쉽게 만들지 않습니다. 유용한 문서 주석은 매우 긴 이름보다 더 유용 할 수 있습니다 .

게터

Go는 getter 및 setter에 대한 자동 지원을 제공하지 않습니다. getter와 setter를 직접 제공하는 것은 문제가 없으며 그렇게하는 것이 적절하지만 Getter의 이름에 Get을 넣는 것이 관용적이거나 필요하지 않습니다. owner ( 소문자, 내보내기되지 않음) 라는 필드가있는 경우 getter 메서드는 GetOwner가 아니라 Owner (대문자, 내보내기)라고해야합니다 . 내보내기에 대문자 이름을 사용하면 메서드에서 필드를 구분하는 후크가 제공됩니다. 필요한 경우 setter 함수를 SetOwner라고합니다 . 두 이름 모두 실제로 잘 읽습니다.

owner := obj.Owner()
if owner != user {
    obj.SetOwner(user)
}

인터페이스 이름

관례 상, 단일 메소드 인터페이스는 메소드 이름과 -er 접미사 또는 에이전트 명사를 구성하는 유사한 수정 (Reader, Writer, Formatter, CloseNotifier 등)으로 명명 됩니다.

그러한 이름이 많이 있으며 그것들과 그들이 포착하는 함수 이름을 존중하는 것이 생산적입니다. 읽기, 쓰기, 닫기, 플러시, 문자열 등에는 표준 서명과 의미가 있습니다. 혼동을 피하기 위해 동일한 서명과 의미가없는 한 메서드에 이러한 이름 중 하나를 제공하지 마십시오. 반대로 형식이 잘 알려진 형식의 메서드와 동일한 의미를 가진 메서드를 구현하는 경우 동일한 이름과 서명을 제공합니다. ToString이 아닌 문자열 변환기 메서드 String을 호출하십시오 .

MixedCaps

마지막으로 Go의 규칙은 여러 단어로 된 이름을 작성하기 위해 밑줄 대신 MixedCaps 또는 mixedCaps를 사용하는 것 입니다.

심판 : 효과적인 이동


12

Golang에서 대문자로 시작하는 식별자 (예 : CamelCase)를 가진 변수 (또는 함수)는 프로그램의 다른 모든 패키지에 공개 (액세스 가능)되는 반면, 소문자로 시작하는 패키지 (예 : , camelCase)는 선언 된 패키지를 제외한 모든 패키지에 액세스 할 수 없습니다.

다른 패키지에서 변수 (또는 함수)를 사용하려는 경우 CamelCase를 사용해야합니다. 또는 camelCase를 안전하게 사용할 수 있습니다.


1
좋은 답변 +1. 선호되는 Go 용어는 CamelCase가 아닌 MixedCaps 또는 mixedCaps입니다. golang.org/doc/effective_go.html#mixed-caps를 참조 하세요 .
Tom L
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.