레이블이 gopls인 게시물을 표시합니다. 모든 게시물 표시
레이블이 gopls인 게시물을 표시합니다. 모든 게시물 표시

gopls modernize

# gopls 0.18 부터 modernize 기능 추가됐다.
# modernize 분석은 최신 go 기능을 사용해 간단하고 명확한 코드로 제안(변경)한다.
# modernize 항목들에 대한 설명은 다음 문서에 명시돼 있다.

# nvim(lazyvim)에서 사용하기
# gopls 0.18 이상 최신 버전을 다시 설치
:MasonInstall gopls

# lsp 플러그인에서 analyses > modernize 사용 여부를 설정(디폴트: true)
  {
    "neovim/nvim-lspconfig",
    opts = {
      servers = {
        gopls = {
          settings = {
            gopls = {
              analyses = {
                modernize = true,
... 생략

# nvim 에서 사용시 해당 코드라인에서 -> code -> code action 으로 modernize 적용

#####

# cli 에서 사용하기
# gopls 커맨드 설치
go install golang.org/x/tools/gopls@latest

# 체크 리스트 확인
gopls check $(fd --type file .go)

# 소스 파일 전체에 대해 modernize 방식으로 일괄 변경
go run golang.org/x/tools/gopls/internal/analysis/modernize/cmd/modernize@latest -test -fix ./...

golang staticcheck

# nvim+golang 개발환경에서 다음 2개의 툴을 사용하고 있었는데,
# golangc-lint : lint
# gopls : hint, staticcheck, hints...
# diagnostics 로 나오는 staticcheck 를 모두 모아 보고 싶어 staticcheck 커맨드를 별도 설치해서 돌려봤다.
# 설치
go install honnef.co/go/tools/cmd/staticcheck@latest
staticcheck -checks inherit,-ST1005 ./...

# QF(QuickFix)xxx 결과는 보이지 않고, 실제 체크리스트에서 QF 는 없다.
staticcheck -list-checks

# 알고보니 QF 는 nvim,vscode 등의 IDE 환경에서 gopls 로 staticcheck 를 사용시에만 IDE 로 보인다고 한다.
# 참고로 nvim(lazyvim) 에 gopls 설정

# 테스트
# staticcheck 커맨드에선 QF 결과가 없다.
staticcheck ./...
ysoftman.go:7:5: don't use Yoda conditions (ST1017)

# nvim(lazyvim) 에서 <leader> -> x(diagnostics/quickfix) -> x(diagnostics) 보면 QF도 같이 보인다.

# 문제가 있는 라인으로 커서 이동후 <leader> -> c(code) -> a(code action) 으로 수정할 수 있다.
# yoda conditions 수정하기 (https://staticcheck.dev/docs/checks#ST1017)
# golang 에서는 if 내에서 = 로 할당이 안되기 때문에 c++ 처럼 값을 왼쪽에 명시해 할당 실수를 방지하는 스타일로 짜지 않아도 된다. golang 에서도 빌드는 문제 없지만 이런식은 자연스럽지 않다고 요렇게 st 로 정해두고 있다.
# 참고로 스타워즈 yoda 가 어순을 바꿔 말하는데서 유래됐다고 한다.

# 공통 변수에 대해 if / else if 문을 switch 로 수정하기  (https://staticcheck.dev/docs/checks#QF1003)
# switch 로 바꾸면 가독성이 더 좋아 보인다.

gofumpt

neovim(nvim) gopls 설정을 업데이트한 후 .go 파일을 저장하면
var 로 선언된 변수가 := 로 간단하게 변경된다.

찾아보니 gopls 설정에 gofumpt(https://github.com/mvdan/gofumpt) 활성화되어 있었다.

gofumpt 는 gofmt, goimports 기능을 포함하면서 더 엄격한 포맷팅 규칙을 적용하는 확장된 포맷팅 방식이다.
그래서 gofumpt 포맷팅된 코드는 gofmt, goimports 검사를 통과한다고 한다.
요런 규칙들이 있다.
- 복합 리터럴에서 선행 또는 후행 빈 줄 제거
- 할당 연산자 다음의 불필요한 빈 줄 제거
- 인터페이스에서 불필요한 빈 줄 제거
- 가독성을 위해 함수에서 빈 줄 대신 ) { 라인 사용

# 바이너리 설치
go install mvdan.cc/gofumpt@latest

# 이전의 .go 파일들에 대해 포맷팅을 해봤는데 개인적으로 깔끔해져서 가독성에 더 좋은것 같다.
gofumpt -w -l $(fd --type file .go)

# 참고, gopls 체크사항 확인
gopls check $(fd --type file .go)