Effective Go

soony·2023년 9월 20일

Go

목록 보기
1/2
post-thumbnail

1.Lint

린트(lint) 또는 린터(linter)는 소스 코드를 분석하여 프로그램 오류, 버그, 스타일 오류, 의심스러운 구조체에 표시(flag)를 달아놓기 위한 도구들을 가리킨다. 이 용어는 C 언어 소스 코드를 검사하는 유닉스 유틸리티에서 기원한다.

golang-ci-lint 도구를 이용해 코드의 일관성을 유지한다.

naming convention

go는 기본적으로 MixedCap 또는 mixedCap 표기법을 사용한다.
앞자리가 대문자일 경우에는 다른 package에서도 접근이 가능하지만, 소문자일 경우에는 다른 package에서 접근이 불가능하다.

var internalValue int -> 외부 패키지에서 사용 불가능 
var ExternalValue int -> 외부 패키지에서 사용가능
  1. 문자만을 이용하여 한 단어(단수)로 구성하는 것이 바람직하다.
  2. 디렉토리 이름에는 (-)을 사용한다.
  3. 함수, type, 구조체는 cammel case로 명명한다.
  4. 리시버 이름은 짧게 한다.
    ex) Client -> c
  5. error를 변수로 선언하는 경우 Err라는 prefix를 붙여 선언한다.
var (
   ErrInternal      = errors.New("regexp: internal error")
   ErrUnmatchedLpar = errors.New("regexp: unmatched '('")
   ErrUnmatchedRpar = errors.New("regexp: unmatched ')'")
   ...
)
  1. map 등의 존재 확인
    -> map의 키가 존재하는 지 확인하는 경우에는 ok라는 변수 이름을 사용한다.
    ```
    id, ok := users[userID]
    ```
    참고 자료: https://docs.google.com/document/d/1cBxRMfJm43U25akrLLRj6P4O3TsCk2lqYBeK4D9oCWM/mobilebasic
    https://github.com/uber-go/guide/blob/master/style.md#pointers-to-interfaces

comment

  • TODO: 해야할 작업
  • FIXME: 오작동
  • NOTE: 노트
  • XXX: 심각한 문제가 있음

getter / setter

  • getter는 명사형식으로 사용한다.
  • setter는 앞에 동사를 붙여도 상관없다.
owner := obj.Owner()
if owner != user {
    obj.SetOwner(user)
}

2.ERROR

panic,fatal

- panic,fatal은 발생하게 되면 프로세스를 종료시키기 때문에 사용하지 않는 것이 일반적이다.
- 사용한다면 프로세스가 처음으로 실행되는 main.go 함수에서 사용하는 것을 권장한다. 
- Must prefix를 붙이는 것이 관례이다. 

Error logging

- fmt.errorf("%w",err)
	- stack trace가 되지 않음.
    - log.Printf("%+v",err)
- errors.Wrap(err,msg)
	- stack trace가 가능함.
    

3.slice

slice 선언하기

var t []string
-> 빈 배열, 포인터 == nil

t := []string{}
-> 빈 배열, 포인터 != nil

slice nil check

if t == nil{
} (X)
 
if len(t) == 0 {
} (O)

len을 이용해 빈 값인지 확인하자.

slice 선언 시 make를 이용해 len,cap을 설정하자.

var sl []string

sl := make([]string,len(변수))
  • 성능차이가 꽤 나는 걸로 알고 있다.

4.for 문

for i,v := range(t) {
} 

for i:=0;i<len(t);i++{
} 

포인터를 사용하고 싶다면 아래의 for문을 이용해 slice 또는 struct에 접근해야 한다.

참고자료:
https://blog.banksalad.com/tech/go-best-practice-in-banksalad/#nil-slice-vs-empty-slice

profile
하루의성과

0개의 댓글