Golang 미사용 가져 오기 오류를 비활성화하는 방법


96

기본적으로 Go는 사용하지 않는 가져 오기를 오류로 처리하여 가져 오기를 강제로 삭제합니다. 이 동작을 변경할 희망이 있는지 알고 싶습니다 (예 : 경고로 줄이기).

이 문제는 매우 성 가셔서 Go에서 코딩을 즐길 수 없습니다.

예를 들어, 일부 코드를 테스트하여 세그먼트 / 기능을 비활성화했습니다. lib의 일부 기능은 더 이상 사용되지 않지만 (예 : fmt, 오류 등) 약간의 테스트 후에 기능을 다시 활성화해야합니다. 이제 해당 가져 오기를 제거하지 않으면 프로그램이 컴파일되지 않으며 몇 분 후에 lib를 다시 가져와야합니다.

나는 GAE 프로그램을 개발할 때이 과정을 몇 번이고 반복했습니다.


1
사용하지 않는 가져 오기를 코드에 남겨 두는 것은 좋지 않지만 일시적으로 주석 처리 할 수 ​​있습니다.
elithrar 2013 년

70
사용하지 않는 수입품을 남겨 두는 것은 좋은 생각이 아니라는 데 동의하지만, 이런 일을하려는 프로그래머의 노력을 불필요하게 낭비하는 것은 나쁜 생각입니다. 특히 이것은 무언가를 테스트 할 때 매우 자주 발생합니다. 그 반대표는 바둑 팬들의 내 태도에 대한 것임에 틀림 없다.
Nick


1
사용하지 않는 수입품을 제거하는 것은 좋은 일입니다. 모든 경고를 오류로 처리해야하는 스타일 가이드가 많이 있으므로 일반적으로 새 경고를 추가하는 것은 좋지 않습니다. 아마도 -dev 플래그는 타협 가능성이있을 수 있지만 제대로 var _ = <module>.Function작동하며 일반적인 관행이되지 않도록 충분히 눈에 띕니다.
deft_code 2013 년

1
누군가 아래 답변에서 만지고 있으므로 가져 오기를 관리하는 IDE (Gogland, LiteIDE 등-여러 개가 있음)를 사용하거나 goimports빌드 프로세스의 한 단계를 사용하는 것이 좋습니다 . 둘 중 하나가 없으면 정말 빨리 늙습니다.
Josef Grahn

답변:


36

_패키지 이름 앞에 밑줄 ( )을 추가하면 사용하지 않는 가져 오기 오류가 무시됩니다.

다음은이를 사용하는 방법의 예입니다.

import (
    "log"
    "database/sql"

    _ "github.com/go-sql-driver/mysql"
)

부작용 (초기화)만을 위해 패키지를 가져 오려면 빈 식별자를 명시 적 패키지 이름으로 사용하십시오.

https://golang.org/ref/spec#Import_declarations 에서 자세히보기


이것이 정답입니다. GoLang 사양 문서에 따라 부작용 (초기화)을 위해서만 패키지를 가져 오는 데 사용됩니다. : GoLang 사양 문서 여기 golang.org/ref/spec#Import_declarations

단순히 환상적입니다. 이것은 golang을 처음 접하는 개발자가 알아야 할 10 가지 주요 사항 목록에 있어야합니다. 감사합니다!
JM Janzen

9
별로 유용하지 않습니다. 이 문제는 나중에 다시 가져 오기를 사용하려면 제거해야한다는 것입니다 _(그렇지 않으면 이름이 없으므로 패키지를 참조 할 수 없습니다). 그렇게하려는 경우 댓글을 달거나 주석 해제하는 것이 좋습니다. var _ = ...트릭이 문제가되지 않습니다.
EM0

당신이 밑줄을 추가하는 경우 "fmt"고글란 트 섬에 자동으로 추가 "fmt"당신이 모두를 가질 수 있도록 _"fmt"하고 "fmt",이 IDE에서이 쓸모 렌더링하는
kramer65

26

var _ = fmt.Printf트릭은 여기에 도움이됩니다.


이 솔루션이 마음에 듭니다. 그것은 바람직하지 않게 만들 정도로 추악하지만 작동하므로 정말로 필요한 경우 거기에 있습니다.
deft_code 2013 년

3
자세한 내용은이 링크를 확인하십시오. tip.golang.org/doc/effective_go.html#blank_unused
Deepak Singh Rawat

3
지금은 도움이되지만이 기술을 사용할 때는 나중에 돌아가서 사용하지 않는 빈 식별자를 삭제하지 않는 경향이 있었기 때문에 장기적으로 사용하지 않으려는 경우 가져 오기가 계속 남아있게되었습니다. goimports와 같은 도구를 사용하면 실제 문제가 해결되고 가져 오기가 항상 최소화되고 깨끗합니다.
mdwhatcott 2015

내 의견으로는 여전히 어리석은 해킹이지만 아마도 가장 효율적인 일입니다.
Anthony

+1 은 파일의 어느 곳에서나 수행 할 수 있기 때문에 일반적으로 끔찍한 생각이지만 import컴파일이나 테스트를 시도 할 때 파일을 건너 뛰어 명령문으로 이동했다가 다시 돌아 오는 것을 방지하는 데 정말 유용합니다 . 반복적으로 구체화 하는 일부 코드 파일 .
mtraceur

21

나도 같은 문제가있어. 나는 그들이 사용하지 않는 가져 오기 및 변수를 허용하지 않도록 언어를 구현 한 이유를 이해하지만 개인적으로 코드를 작성할 때이 기능이 성가시다는 것을 알았습니다. 이 문제를 해결하기 위해 컴파일러를 변경하여 사용하지 않는 변수와 코드 가져 오기를 허용하는 선택적 플래그를 허용했습니다.

관심이 있으시면 https://github.com/dtnewman/modified_golang_compiler 에서 확인할 수 있습니다. .

이제 go run -gcflags '-unused_pkgs'test.go 와 같은 명령으로 코드를 간단히 실행할 수 있습니다. 이러한 "사용하지 않는 가져 오기"오류가 발생하지 않습니다. 이 플래그를 생략하면 사용하지 않는 가져 오기를 허용하지 않는 기본값으로 돌아갑니다.

이렇게하려면 몇 가지 간단한 변경 만 필요했습니다. Go 순수 주의자들은 사용하지 않는 변수 / 임포트를 허용하지 않는 타당한 이유가 있기 때문에 이러한 변경에 만족하지 않을 것입니다. 그러나 저는이 문제가 Go에서 코딩하는 것이 훨씬 덜 즐겁다는 점에 개인적으로 동의합니다. 컴파일러.


2
1.6 릴리스에서도 동일한 작업을 수행했습니다. 관심이있는 경우 여기에서 확인하십시오. github.com/ronelliott/go/tree/release-branch.go1.6 참고 : 일부 테스트는 실패합니다
Ron E

2
나는 이것 뒤에있는 아이디어를 좋아합니다. 나는 당신이 fork가 여전히 1.2 버전이므로 쓸모가 없다는 것을 알았습니다. 이것은 최소한 go run main.go기본적으로 오류 를 비활성화하고 오류 를 활성화 하도록 표준 go 컴파일러에 포함되어야 go build합니다. 이렇게하면 개발하기가 쉽고 go run프로덕션을 위해 빌드 할 때 코드를 정리해야합니다.
kramer65

17

goimports를 사용하십시오 . 기본적으로 gofmt브래드 피츠 패트릭 (Brad Fitzpatrick)이 작성한 의 포크 이며 이제는 go 도구 패키지에 포함됩니다. 파일을 저장할 때마다 실행되도록 편집기를 구성 할 수 있습니다. 이 문제에 대해 다시는 걱정할 필요가 없습니다.


5

fmt개발 및 테스트하는 동안 콘솔에 대한 일반 인쇄용 패키지를 사용하는 경우 로그 패키지 에서 더 나은 솔루션을 찾을 수 있습니다 .


5
또는 println사람들이 항상 잊는 것처럼 보이는 내장 기능 .
MatrixFrog 2013 년

2
@MatrixFrog 장기적으로 이러한 함수는 시간이 지남에 따라 사라질 수 있으므로이를 기반으로 구축하는 것은 좋은 생각이 아닙니다. 로그를 사용하는 것은 좋은 생각입니다. 로그는 표준 라이브러리의 일부이며 제거 될 가능성이 낮기 때문입니다. 자세한 내용 은 사양 을 참조하십시오.
nemo

1
내장 println? 이것은 나에게 뉴스입니다. 문서화되지 않았습니까? 어디에서도 찾을 수 없습니다.
Matt

1
@nemo 좋은 지적. 빠른 일회성으로 무언가를 인쇄해야 할 때 완벽하지만 실제로 체크인 할 의도는 없습니다. 다른 경우에는 사용하는 것이 좋지 않을 수 있습니다.
MatrixFrog 2013 년

1
@MartinTournoij-동의하지 않습니다. 이것은 내가 5 년 전에이 문제를 겪었을 때 결국 찾은 해결책이었고 5 개 이상의 찬성 투표로 다른 사람들에게 분명히 도움이되었습니다. 저는 fmt로깅 을 위해 패키지를 사용하는 초보자 였으며 기성품 로깅 패키지가 있다는 것을 알지 못했습니다.
OldCurmudgeon

5

일부 코드 if false { ... }주석 처리하는 데 사용 합니다 . 중괄호 안의 코드는 구문 상 정확해야하지만 그렇지 않으면 말도 안되는 코드 일 수 있습니다.


3
구문 적으로 올바른 것 이상으로 참조 된 변수 (예 : foo.Bar)가 있어야합니다.
Dragon

이것은 매우 깨끗하거나 관용적이지 않습니다. Go가 디자인 된 이유가 있습니다
Acidic9

1
이것은 스크립트를 개발하거나 Golang에서 API를 탐색하는 동안 단순히 시도 할 때 좋은 기술입니다. topskip 감사합니다!
Jay Taylor

2

많은 사람들이 이미 타당한 타당성에 대해 논평했으며 나는 또한 원저자의 의도를 인정합니다. 그러나 Rob Pike는 Go가 몇몇 다른 주류 프로그래밍 언어가 부족하거나 달성하기 쉽지 않은 프로세스를 단순화 한 결과라고 여러 포럼에서 언급했습니다. Go의 언어 의미론 일뿐만 아니라 컴파일 속도를 높이기 위해 처음에는 비효율적으로 보이는 많은 것들이 채택되었습니다.

간단히 말해서, 사용하지 않는 가져 오기는 Go에서 프로그램을 지우고 컴파일 속도를 늦추기 때문에 오류로 간주됩니다. 부작용 (_)에 대해 가져 오기를 사용하는 것은 해결 방법이지만, 특히 코드 기반이 다음과 같은 경우 디버깅 / 테스트 목적으로 만 가져온 부작용과 함께 부작용이있는 유효한 가져 오기가 혼합되어있을 때 혼란스러워집니다. 나중에 다른 엔지니어 / 리뷰어에게 혼란을 줄 수있는 실수로 삭제하거나 삭제하지 않을 기회가 있습니다. 나는 사용하지 않는 것을 주석으로 처리했지만 VS 코드와 Goland와 같은 인기있는 IDE는 goimports쉽게 사용할 수 있으므로 가져 오기의 삽입 및 삭제가 꽤 잘됩니다. 자세한 내용은 https://golang.org/doc/effective_go.html#blank_import 링크를 참조 하세요.


감사합니다! 부작용에 대한 가져 오기의 구체적인 예로서 귀하의 응답에 게시 한 URL의 코드 행을 명시 적으로 복사하여 붙여 넣는 것이 좋습니다. import _ "net/http/pprof"
Dragon

1
귀하의 제안에 대해 @Dragon에게 감사드립니다! 나는 새로운 기여자이기 때문에 당신과 같은 사람들의 도움으로 내 게시물이 빨리 나아질 것입니다.
sbcharr

-1

이것을 문서 위에 올려 놓고 사용하지 않은 수입품은 잊어 버리십시오.

import (
    "bufio"
    "fmt"
    "os"
    "path/filepath"
)

var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs

1
대신 컴파일러가 죽은 코드를 생성 만드는 경우 당신이 정말로 이렇게하고 싶어, 사용하는 _전역 변수 대신 (예를 들어 어느 한 줄 당하거나 주장하는 경우 패키지처럼 모두 함께 : var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs). 하지만 이렇게하지 말고 goimports.
Dave C
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.