1. concurrency를 구현할 때 메모리를 공유하려 함


메모리를 공유하고 락을 거는 것보다 채널을 이용해 데이터를 전송한 다음 처리할 것을 권장


ex)

컨테이너를 만들어 놓고 각 고루틴에 나눠준 후 컨테이너에 데이터 넣을 때 락을 건다 : no

각 고루틴에 채널을 나눠주고 그 채널에 데이터를 넣은 다음 데이터를 받는 쪽에서 처리한다 : yes


2. 임베딩을 반복하려 함


Go에는 클래스 및 상속의 개념이 없으나 구조체/인터페이스 임베딩을 통해 비슷하게 쓸 수 있음

그러나 계속 중첩해나가는 걸 권장하지 않음


3. 각종 디자인 패턴들을 구현하려 함


Go에서는 디자인 패턴처럼 복잡한 구조보다는 최대한 단순한 구조를 권장

그 흔한 팩토리 메서드, 추상 팩토리 등도 잘 안 쓰임

물론 필요에 따라 간단한 건 가끔씩 쓰임(net/http에서 패키지 기본 핸들러를 위해 싱글턴을 쓴다든가)


4. getter 이름에 Get을 붙이려 함


Go에서는 Get을 넣지 않는게 일반적인 컨벤션

단 setter에는 Set을 붙임


ex)

func (p *Position) GetX() int8 : no

func (p *Position) X() int8 : yes

func (p *Position) SetX(x int8) : yes


5. 특정 타입명(보통은 클래스를 대신하는 구조체 타입명) 첫자를 전부 대문자로 쓰려 한다


Go에서는 첫자가 대문자인 것들만 패키지 밖에서 사용 가능

따라서 첫자의 케이스는 타입이 뭐냐가 아닌 패키지 밖으로 공개할거냐를 기준으로 삼아야 함

그럼에도 타입과 인스턴스를 쉽게 구분하기 위해 대문자를 쓰고 보는게 낫다는 사람들도 있음


ex)

무조건 아래처럼 쓰는 경우 : usually no

type Person struct {

    Name string

    Age int

}

person := Person{Name: "John", Age: 30}