Golang Static check list
2024-05-09고언어 정적 오류 체크 리스트
오류 메시지도 한글로 보여주면 좋겠는데,아쉽다는 생각이다.
오류메시지 무시
단일 무시
//lint:ignore Check1[,Check2,…,CheckN] reason
//예시
value *big.Int //lint:ignore U1000 unused field is part of test
파일 무시
//lint:file-ignore [Lint Code] [error msg]
//lint:file-ignore U1000 Ignore all unused code, it's generated
package main
오류메시지 확인
Check | 설명 |
---|---|
U1000 | 사용되지 않는 변수,상수,함수,기타등등 |
Check | 설명 |
---|---|
SA | staticcheck |
SA1 | 표준 라이브러리의 다양한 오용 |
SA1000 | 잘못된 정규 표현식 |
SA1001 | 잘못된 템플릿 |
SA1002 | 형식이 잘못되었습니다.time.Parse |
SA1003 | 의 함수에 대해 지원되지 않는 인수encoding/binary |
SA1004 | 의심스럽게 작은 형식화되지 않은 상수time.Sleep |
SA1005 | 첫 번째 인수가 잘못되었습니다.exec.Command |
SA1006 | Printf동적 첫 번째 인수가 있고 추가 인수가 없습니다. |
SA1007 | 잘못된 URLnet/url.Parse |
SA1008 | http.Header맵 의 비정규 키 |
SA1010 | (*regexp.Regexp).FindAll으로 호출하면 n == 0항상 0개의 결과가 반환됩니다. |
SA1011 | 패키지 의 다양한 메소드에서 strings유효한 UTF-8이 필요하지만 잘못된 입력이 제공되었습니다. |
SA1012 | nil이 context.Context함수에 전달되고 있습니다. context.TODO대신 사용을 고려해 보세요. |
SA1013 | io.Seeker.Seek첫 번째 인수로 wherece 상수를 사용하여 호출되고 있지만 두 번째 인수여야 합니다. |
SA1014 | Unmarshal또는 에 전달된 포인터가 아닌 값Decode |
SA1015 | time.Tick누출되는 방식으로 사용하십시오 . 사용을 고려하고 테스트, 명령 및 무한 기능 time.NewTicker에만 사용하십시오.time.Tick |
SA1016 | 트랩할 수 없는 신호 트랩하기 |
SA1017 | 와 함께 사용되는 채널은 os/signal.Notify버퍼링되어야 합니다. |
SA1018 | strings.Replacen == 0아무것도 하지 않는 으로 호출됨 |
SA1019 | 더 이상 사용되지 않는 함수, 변수, 상수 또는 필드 사용 |
SA1020 | net.Listen관련 기능 에 잘못된 호스트:포트 쌍 사용 |
SA1021 | bytes.Equal두 개를 비교하는 데 사용net.IP |
SA1023 | io.Writer구현 에서 버퍼 수정 |
SA1024 | 문자열 컷셋에 중복된 문자가 포함되어 있습니다. |
SA1025 | (*time.Timer).Reset의 반환 값을 올바르게 사용할 수 없습니다 . |
SA1026 | 채널이나 기능을 마샬링할 수 없습니다. |
SA1027 | 64비트 변수에 대한 원자적 액세스는 64비트로 정렬되어야 합니다. |
SA1028 | sort.Slice슬라이스에만 사용할 수 있습니다. |
SA1029 | 호출 시 부적절한 키context.WithValue |
SA1030 | strconv함수 호출 시 잘못된 인수 |
SA2 | 동시성 문제 |
SA2000 | sync.WaitGroup.Add고루틴 내부에서 호출되어 경쟁 조건이 발생함 |
SA2001 | 중요 섹션이 비어 있습니다. 잠금 해제를 연기하시겠습니까? |
SA2002 | 허용되지 않는 호출 testing.T.FailNow또는 고루틴에서SkipNow |
SA2003 | 잠금 Lock직후 연기됨, Unlock대신 연기할 가능성이 높음 |
SA3 | 테스트 문제 |
SA3000 | TestMain호출하지 않고 os.Exit테스트 실패를 숨깁니다. |
SA3001 | 벤치마크 에 할당하면 b.N결과가 왜곡됩니다. |
SA4 | 실제로 아무것도 하지 않는 코드 |
SA4000 | 이진 연산자는 양쪽에 동일한 표현식이 있습니다. |
SA4001 | &*x로 단순화되어 x복사되지 않습니다.x |
SA4003 | 부호 없는 값을 음수 값과 비교하는 것은 의미가 없습니다. |
SA4004 | 루프는 한 번의 반복 후에 무조건 종료됩니다. |
SA4005 | 절대 지켜지지 않는 현장 배정. 포인터 수신기를 사용하려고 하셨나요? |
SA4006 | 변수에 할당된 값은 덮어쓰기 전에는 읽혀지지 않습니다. 오류 확인이나 데드 코드를 잊어버리셨나요? |
SA4008 | 루프 조건의 변수는 절대 변경되지 않습니다. 잘못된 변수를 증가시키고 있습니까? |
SA4009 | 함수 인수를 처음 사용하기 전에 덮어씁니다. |
SA4010 | 결과는 append어디에서도 관찰되지 않습니다. |
SA4011 | 효과가 없는 Break 문입니다. 외부 루프에서 벗어나려고 했나요? |
SA4012 | NaN과 같은 값이 없더라도 NaN과 값 비교 |
SA4013 | 부울 값을 두 번 부정하는 것( !!b)은 쓰는 것과 같습니다 b. 이는 중복되거나 오타입니다. |
SA4014 | if/else if 체인에 조건이 반복되고 부작용이 없습니다. 조건이 처음에 일치하지 않으면 두 번째에도 일치하지 않습니다. |
SA4015 | 정수에서 변환된 부동 소수점 과 같은 함수를 호출하는 것은 math.Ceil유용한 일을 하지 않습니다. |
SA4016 | 와 같은 특정 비트 연산은 x ^ 0유용한 작업을 수행하지 않습니다. |
SA4017 | 부작용 없이 함수의 반환 값을 폐기하여 호출을 무의미하게 만듭니다. |
SA4018 | 변수의 자체 할당 |
SA4019 | 동일한 파일에 여러 개의 동일한 빌드 제약 조건이 있음 |
SA4020 | 유형 스위치의 도달할 수 없는 Case 절 |
SA4021 | x = append(y)는 다음과 같습니다x = y |
SA4022 | nil과 변수의 주소 비교 |
SA4023 | 유형이 지정되지 않은 nil과 인터페이스 값의 비교가 불가능합니다. |
SA4024 | 내장 함수에서 불가능한 반환 값 확인 |
SA4025 | 0이 되는 리터럴의 정수 나누기 |
SA4026 | Go 상수는 음의 0을 표현할 수 없습니다. |
SA4027 | (*net/url.URL).Query복사본을 반환하며 이를 수정해도 URL은 변경되지 않습니다. |
SA4028 | x % 1항상 0이다 |
SA4029 | 슬라이스 정렬에 대한 비효율적인 시도 |
SA4030 | 난수 생성에 대한 비효율적인 시도 |
SA4031 | nil에 대해 절대 nil 값 확인 |
SA5 | 정확성 문제 |
SA5000 | nil 맵에 할당 |
SA5001 | Close가능한 오류를 확인하기 전에 연기 |
SA5002 | 빈 for 루프( for {})가 회전하여 스케줄러를 차단할 수 있습니다. |
SA5003 | 무한 루프의 지연은 실행되지 않습니다. |
SA5004 | for { select { …빈 기본 분기가 회전합니다. |
SA5005 | 종료자는 종료된 객체를 참조하여 가비지 수집을 방지합니다. |
SA5007 | 무한 재귀 호출 |
SA5008 | 잘못된 구조체 태그 |
SA5009 | 잘못된 Printf 호출 |
SA5010 | 불가능한 유형 주장 |
SA5011 | 가능한 nil 포인터 역참조 |
SA5012 | 짝수 크기를 기대하는 함수에 홀수 크기 슬라이스 전달 |
SA6 | 성능 문제 |
SA6000 | regexp.Match루프에서 사용하거나 관련하려면 사용해야 합니다.regexp.Compile |
SA6001 | 바이트 슬라이스로 맵을 인덱싱할 때 최적화 기회가 누락됨 |
SA6002 | sync.Pool할당된 메모리 에 포인터가 아닌 값 저장 |
SA6003 | 문자열을 범위 지정하기 전에 문자열을 룬 조각으로 변환 |
SA6005 | strings.ToLoweror를 사용한 비효율적인 문자열 비교strings.ToUpper |
SA9 | 틀릴 가능성이 높은 모호한 코드 구성 |
SA9001 | 범위 루프의 지연은 예상할 때 실행되지 않을 수 있습니다. |
SA9002 | os.FileMode8진수로 의도된 것처럼 보이는 8진수가 아닌 문자를 사용합니다 . |
SA9003 | if 또는 else 분기의 빈 본문 |
SA9004 | 첫 번째 상수에만 명시적인 유형이 있습니다. |
SA9005 | 공개 필드나 사용자 정의 마샬링 없이 구조체를 마샬링하려고 합니다. |
SA9006 | 고정 크기 정수 값의 모호한 비트 이동 |
SA9007 | 삭제하면 안 되는 디렉토리 삭제 |
SA9008 | else유형 주장의 분기가 올바른 값을 읽지 못하는 것 같습니다. |
S | Simple |
S1 | 코드 단순화 |
S1000 | 단일 케이스 선택 대신 일반 채널 전송 또는 수신 사용 |
S1001 | for 루프를 복사 호출로 교체 |
S1002 | 부울 상수와의 비교 생략 |
S1003 | strings.Index호출을 다음으로 대체strings.Contains |
S1004 | bytes.Compare호출을 다음으로 대체bytes.Equal |
S1005 | 공백 식별자의 불필요한 사용을 삭제하세요. |
S1006 | for { … }무한 루프에 사용 |
S1007 | 원시 문자열 리터럴을 사용하여 정규식 단순화 |
S1008 | 반환 부울 표현식 단순화 |
S1009 | 슬라이스에 대한 중복 nil 검사 생략 |
S1010 | 기본 슬라이스 인덱스 생략 |
S1011 | 단일을 사용하여 append두 개의 슬라이스를 연결합니다. |
S1012 | time.Now().Sub(x)다음 으로 교체time.Since(x) |
S1016 | 구조체 필드를 수동으로 복사하는 대신 유형 변환을 사용하세요. |
S1017 | 수동 트리밍을 다음으로 대체하십시오.strings.TrimPrefix |
S1018 | copy슬라이딩 요소에 사용 |
S1019 | make중복 인수를 생략하여 호출 단순화 |
S1020 | 유형 어설션에서 중복된 nil 검사를 생략합니다. |
S1021 | 변수 선언 및 할당 병합 |
S1023 | 중복 제어 흐름 생략 |
S1024 | x.Sub(time.Now())다음 으로 교체time.Until(x) |
S1025 | fmt.Sprintf(“%s”, x)불필요하게 사용하지 마세요 |
S1028 | 다음을 사용하여 오류 구성을 단순화하세요.fmt.Errorf |
S1029 | 문자열에 대한 직접 범위 |
S1030 | 사용 bytes.Buffer.String하거나bytes.Buffer.Bytes |
S1031 | 루프 주변의 중복된 nil 검사를 생략합니다. |
S1032 | sort.Ints(x), 및sort.Float64s(x)sort.Strings(x) |
S1033 | 통화 주변에 불필요한 가드delete |
S1034 | 유형 주장의 결과를 사용하여 사례 단순화 |
S1035 | net/http.CanonicalHeaderKey메소드 호출 에 대한 중복 호출net/http.Header |
S1036 | 지도 접근에 대한 불필요한 가드 |
S1037 | 정교한 수면 방식 |
S1038 | 형식화된 문자열을 인쇄하는 불필요하게 복잡한 방법 |
S1039 | 불필요한 사용fmt.Sprint |
S1040 | 현재 유형에 대한 유형 주장 |
ST | stylecheck |
ST1 | 문체 문제 |
ST1000 | 패키지 설명이 잘못되었거나 누락되었습니다. |
ST1001 | 도트 가져오기는 권장되지 않습니다. |
ST1003 | 잘못 선택된 식별자 |
ST1005 | 형식이 잘못된 오류 문자열 |
ST1006 | 잘못 선택한 수신자 이름 |
ST1008 | 함수의 오류 값은 마지막 반환 값이어야 합니다. |
ST1011 | 유형의 변수에 대해 잘못 선택된 이름time.Duration |
ST1012 | 오류 변수에 대해 잘못 선택된 이름 |
ST1013 | 매직 넘버가 아닌 HTTP 오류 코드에 상수를 사용해야 합니다. |
ST1015 | 스위치의 기본 케이스는 첫 번째 또는 마지막 케이스여야 합니다. |
ST1016 | 일관된 메소드 수신자 이름 사용 |
ST1017 | Yoda 조건을 사용하지 마십시오 |
ST1018 | 문자열 리터럴에서 너비가 0인 문자와 제어 문자를 사용하지 마세요. |
ST1019 | 동일한 패키지를 여러 번 가져오기 |
ST1020 | 내보낸 함수의 문서는 함수 이름으로 시작해야 합니다. |
ST1021 | 내보낸 유형의 문서는 유형 이름으로 시작해야 합니다. |
ST1022 | 내보낸 변수나 상수의 문서는 변수 이름으로 시작해야 합니다. |
ST1023 | 변수 선언의 중복 유형 |
QF | quickfix |
QF1 | 빠른 수정 |
QF1001 | 드 모르간(De Morgan)의 법칙을 적용하세요 |
QF1002 | 태그가 없는 스위치를 태그가 있는 스위치로 변환 |
QF1003 | if/else-if 체인을 태그된 스위치로 변환 |
QF1004 | strings.ReplaceAll대신 사용strings.Replacen == -1 |
QF1005 | 통화 확장math.Pow |
QF1006 | if+를 break루프 상태로 들어 올리기 |
QF1007 | 조건부 할당을 변수 선언에 병합 |
QF1008 | 선택기 표현식에서 포함된 필드 생략 |
QF1009 | 연산자 time.Time.Equal대신 사용== |
QF1010 | 인쇄할 때 바이트 조각을 문자열로 변환합니다. |
QF1011 | 변수 선언에서 중복 유형 생략 |
QF1012 | fmt.Fprintf(x, …)대신 사용x.Write(fmt.Sprintf(…)) |