성가신 오류“선언되고 사용되지 않음”을 피하는 방법


238

나는 Go를 배우고 있지만 컴파일 할 때 변수 나 패키지를 사용하지 않은 채두면 안된다고 생각합니다.

이것은 정말로 나를 느리게합니다. 예를 들어 새 패키지를 선언하고 나중에 사용하거나 테스트 할 명령의 주석 처리를 제거하려고했습니다. 나는 항상 오류가 발생하고 그 모든 용도에 대해 언급해야합니다.

Go에서 이런 종류의 확인을 피할 수있는 방법이 있습니까?


1
또한 가져 오기 ( godoc.org/code.google.com/p/go.tools/cmd/goimports )를 사용 하여 가져 오기를 자동으로 추가 / 제거 할 수 있습니다.
elithrar


3
여전히 컴파일러 옵션이 "디버깅을 돕기 위해 무언가를 주석 처리하고"워크 플로에 유용 할 것이라고 생각합니다.
RJFalconer

13
이 기능은 사람들의 시간을 낭비하는 좋은 방법입니다. 요점은 무엇입니까? 코드를 커밋 / 배송 할 때 사용하지 않는 var는 좋지 않지만 개발할 때 좋은가요? 끔찍 해요
Alexander Mills

2020 년이며 여전히 컴파일러 플래그를 사용 하여이 문제를 해결하지 못했다고 믿을 수 없습니다. 나는 약 5 년 전에 Go에서 프로젝트를 수행했으며 전반적으로 언어를 좋아했지만 이것 때문에 나에게만 사용할 수 없었습니다. 내가 코딩하는 방식은 끊임없이 주석을 달거나 주석을 제거하는 것이므로 Go 의이 "기능"으로 인해 시간이 두 배가 걸립니다 ... 그 이후 몇 달마다 다시 한 번 확인하여 이유 의식이 극복되었는지 확인했습니다. 바둑 팀, 그리고 지금까지 운이 없다 ... 짜증. 그렇지 않으면 훌륭한 언어이며 더 많이 사용하고 싶지만 현재는 사용할 수 없습니다.
Ruslan

답변:


234

이 오류는 더 나은 코드를 작성하고 선언하거나 가져 오는 모든 것을 사용해야합니다. 다른 사람들이 작성한 코드를 더 쉽게 읽을 수있게하고 (선언 된 모든 변수가 사용될 것임을 항상 확신하고) 가능한 코드를 피하십시오.

그러나이 오류를 정말로 건너 뛰려면 빈 식별자 ( _)를 사용할 수 있습니다 .

package main

import (
    "fmt" // imported and not used: "fmt"
)

func main() {
    i := 1 // i declared and not used
}

된다

package main

import (
    _ "fmt" // no more error
)

func main() {
    i := 1 // no more error
    _ = i
}

아래 의견에서 kostix가 말한 것처럼 FAQ에서 Go 팀의 공식 위치를 찾을 수 있습니다 .

사용하지 않는 변수가 있으면 버그가 표시 될 수 있지만 사용하지 않는 가져 오기는 컴파일 속도가 느려집니다. 코드 트리에서 사용하지 않은 가져 오기를 충분히 누적하면 속도가 느려질 수 있습니다. 이러한 이유로 Go는 둘 다 허용하지 않습니다.


90
그럼에도 불구하고 이것은 주석 처리하는 것과 크게 다르지 않습니다. 그리고 이것은 더 나은 코드를위한 것임을 이해하지만 코드에서 테스트하는 이유를 확인한 다음 코드를 끝내고 깨끗하게 한 후에이 확인을 다시 열면 더 좋을까요?
A-letubby

21
@ kostix 음 .. 당신이 전문가 일 수 있기 때문에 속도를 늦추지 않을 수도 있지만 그것은 나에게 그리고 코딩 방식입니다. 더 좋은 방법이 있는지 궁금합니다. 어쨌든 FAQ에 감사드립니다! 이것을 읽음으로써, golang이 이런 식으로하는 이유를 완전히 이해할 수 있습니다.
A-letubby

20
이것을 끄는 명령 줄 인수가 있습니까? 아니면 변경할 수없는 기능입니까?
Ethan Bierlein

26
FWIW, 나는 다른 사람들의 코드를 읽는 데 어려움을 겪었지만 분명히 사용되지 않은 기호 때문이 아닙니다. OTOH, 오늘이 * # % $ golang "feature"를 다루는 방법을 조사하는 시간을 잃었습니다.
Torsten Bronger 2016 년

24
안타깝게도이 답변은 맞습니다. 그러나 그것은 정당하지 않습니다. 코드 체크인과 단순히 실행하는 것에는 차이가 있습니다. 코드를 체크인 할 때, 린터를 사용하여 이런 종류의 오류를 포착합니다. 우리가 빠른 개발 중에 실행할 때, 우리는 같은 표준을 가지고 있지 않습니다. 컴파일러를 린터와 혼동하는 것은 용서할 수 없습니다. 구글 내부의 스타일 경찰조차 그런 실수를하지 않습니다.
트래비스 윌슨

29

이를 위해 간단한 "널 함수"를 사용할 수 있습니다.

func Use(vals ...interface{}) {
    for _, val := range vals {
        _ = val
    }
}

다음과 같이 사용할 수 있습니다.

package main

func main() {
    a := "declared and not used"
    b := "another declared and not used"
    c := 123

    Use(a, b, c)
}

이를 위한 패키지도 있으므로 Use매번 함수 를 정의 할 필요가 없습니다 .

import (
  "github.com/lunux2008/xulu"
)

func main() {
  // [..]

  xulu.Use(a, b, c)
}

29

FAQ 에 따르면 :

일부는 검사를 끄거나 적어도 경고로 줄이기 위해 컴파일러 옵션을 요청했습니다. 그러나 컴파일러 옵션은 언어의 의미에 영향을 미치지 않아야하고 Go 컴파일러는 경고를보고하지 않으며 컴파일을 방해하는 오류 만보고하므로 이러한 옵션은 추가되지 않았습니다.

경고가없는 데는 두 가지 이유가 있습니다. 첫째, 불평 할 가치가 있다면 코드를 수정하는 것이 좋습니다. 두 번째로, 컴파일러가 경고를 생성하게하면 컴파일시 노이즈가 발생할 수있는 약한 경우에 대해 경고하여 수정해야하는 실제 오류를 마스킹 할 수 있습니다.

나는 여러 가지 이유로 들어갈 가치가 없다는 것에 반드시 동의하지는 않습니다. 그것이 무엇이며 가까운 장래에는 변하지 않을 것입니다.

패키지 goimports에는 누락 된 패키지를 자동으로 추가하고 사용하지 않는 패키지를 제거 하는 도구가 있습니다. 예를 들면 다음과 같습니다.

# Install it
$ go get golang.org/x/tools/cmd/goimports

# -w to write the source file instead of stdout
$ goimports -w my_file.go

Vim과 같은 중간 정도의 편집기에서 이것을 실행할 수 있어야합니다.

:!goimports -w %

goimports페이지에는 다른 편집기에 대한 일부 명령이 나열되며 일반적으로 버퍼를 디스크에 저장할 때 자동으로 실행되도록 설정합니다.

참고 goimports또한 실행됩니다gofmt .


이미 언급했듯이 변수의 가장 쉬운 방법은 (일시적으로) 변수를 할당하는 것입니다 _.

// No errors
tasty := "ice cream"
horrible := "marmite"

// Commented out for debugging
//eat(tasty, horrible)

_, _ = tasty, horrible

9

지금까지 언급되지 않은 한 가지 각도는 코드 편집에 사용되는 도구 세트입니다.

사용 의 Visual Studio 코드 의 확장과 함께 lukehoban 라는 Go당신을 위해 몇 가지 자동 마술을 할 것입니다. 이동 확장자가 자동으로 실행 gofmt, golint등, 그리고 삭제는 추가 import항목을 . 적어도 그 부분은 이제 자동입니다.

나는 그 질문에 대한 해결책의 100 %가 아니라는 점을 인정하지만 충분히 유용 할 것입니다.


8

다른 사람들이이 점을 이해하기 어려운 경우에는 매우 간단한 용어로 설명하는 것이 도움이 될 것입니다. 사용하지 않는 변수, 예를 들어 호출을 주석 처리 한 함수 (일반적인 유스 케이스)가있는 경우 :

myFn := func () { }
// myFn()

쓸모 없거나 공백 인 변수를 더 이상 사용하지 않도록 함수에 할당 할 수 있습니다 사용하지 .

myFn := func () { }
_ = myFn
// myFn()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.