Cara menonaktifkan kesalahan impor Golang yang tidak digunakan

98

Secara default, Go memperlakukan impor yang tidak digunakan sebagai kesalahan, memaksa Anda untuk menghapus impor. Saya ingin tahu apakah ada harapan untuk mengubah perilaku ini, misalnya menguranginya menjadi peringatan.

Saya menemukan masalah ini sangat mengganggu, mencegah saya menikmati pengkodean di Go.

Misalnya, saya menguji beberapa kode, menonaktifkan segmen / fungsi. Beberapa fungsi dari lib tidak lagi digunakan (misalnya fmt, error, apa pun), tetapi saya perlu mengaktifkan kembali fungsi tersebut setelah sedikit pengujian. Sekarang program tidak dapat dikompilasi kecuali saya menghapus impor tersebut, dan beberapa menit kemudian saya perlu mengimpor ulang lib.

Saya melakukan proses ini berulang kali saat mengembangkan program GAE.

Nick
sumber
1
Bukan ide yang baik untuk membiarkan impor yang tidak terpakai dalam kode Anda, tetapi Anda dapat mengomentarinya untuk sementara.
elithrar
72
Saya setuju itu bukan ide yang baik untuk meninggalkan impor yang tidak terpakai tetapi ide yang buruk untuk tidak perlu menyia-nyiakan upaya programmer untuk melakukan hal-hal seperti ini terutama ini terjadi sangat sering ketika menguji sesuatu. Suara negatif itu pasti karena sikap saya untuk GO oleh para penggemar Go.
Nick
6
Ini fitur, bukan bug .
beatgammit
1
Menghapus impor yang tidak terpakai adalah hal yang baik. Ada banyak panduan gaya yang mengharuskan semua peringatan diperlakukan sebagai kesalahan, jadi menambahkan peringatan baru umumnya merupakan ide yang buruk. Mungkin tanda -dev mungkin merupakan kemungkinan kompromi, tetapi var _ = <module>.Functionberfungsi dengan baik dan cukup mencolok untuk mencegahnya menjadi praktik umum.
deft_code
1
Ketika seseorang menyentuh jawaban di bawah ini, saya merekomendasikan baik menggunakan IDE yang mengelola impor (Gogland, LiteIDE, dll. - ada beberapa), atau goimportssebagai langkah dalam proses pembuatan Anda. Tanpa salah satu dari mereka itu menjadi tua sangat cepat.
Josef Grahn

Jawaban:

37

Menambahkan garis bawah (_ ) sebelum nama paket akan mengabaikan kesalahan impor yang tidak digunakan.

Berikut adalah contoh bagaimana Anda dapat menggunakannya:

import (
    "log"
    "database/sql"

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

Untuk mengimpor paket hanya untuk efek sampingnya (inisialisasi), gunakan pengenal kosong sebagai nama paket yang eksplisit.

Lihat selengkapnya di https://golang.org/ref/spec#Import_declarations

Asam9
sumber
Ini jawaban yang benar. Berdasarkan Dokumen spesifikasi GoLang, ini dimaksudkan untuk digunakan untuk mengimpor paket semata-mata untuk efek samping (inisialisasi). Dokumen Spesifikasi GoLang di sini: golang.org/ref/spec#Import_declarations
Akankah
Cukup fantastis. Ini harus ada dalam daftar sepuluh hal teratas yang harus diketahui oleh developer yang baru mengenal golang. Terima kasih!
JM Janzen
11
Tidak terlalu berguna. Masalahnya adalah jika nanti Anda ingin menggunakan impor lagi, Anda harus menghapus _(jika tidak, paket tidak dapat direferensikan, karena tidak memiliki nama). Jika Anda akan melakukan itu, Anda mungkin juga hanya memberi komentar / menghapus komentar. The var _ = ...trick tidak memiliki masalah ini.
EM0
Jika Anda menambahkan garis bawah ke "fmt"di Gogland, itu secara otomatis menambahkan "fmt"sehingga Anda memiliki keduanya _"fmt"dan "fmt", yang menjadikannya tidak berguna di IDE ini
kramer65
26

The var _ = fmt.PrintfTrik ini berguna di sini.

Volker
sumber
Saya suka solusi ini. Itu cukup jelek untuk membuatnya tidak diinginkan, tetapi berfungsi jadi itu ada jika Anda benar-benar membutuhkannya.
deft_code
3
Untuk detail lebih lanjut, silakan periksa tautan ini tip.golang.org/doc/effective_go.html#blank_unused
Deepak Singh Rawat
3
Ini membantu saat ini, tetapi ketika saya menggunakan teknik ini, saya cenderung untuk tidak kembali dan menghapus pengenal kosong yang tidak digunakan nanti, menyebabkan impor tetap ada ketika saya benar-benar tidak bermaksud untuk menggunakannya dalam jangka panjang. Menggunakan alat seperti goimports telah memecahkan masalah sebenarnya dan memastikan bahwa impor saya selalu minimal dan bersih.
mdwhatcott
Masih merupakan peretasan yang bodoh menurut saya, meskipun mungkin hal yang paling efisien untuk dilakukan.
Anthony
+1 karena ini dapat dilakukan di mana saja dalam file , yang biasanya merupakan ide yang buruk tetapi sangat berguna untuk menyelamatkan Anda dari keharusan membuka-buka file untuk mendapatkan importpernyataan dan kembali ketika Anda hanya mencoba untuk mengkompilasi atau menguji beberapa file kode yang Anda susun secara berulang .
mtraceur
22

Saya memiliki masalah yang sama. Saya memahami alasan mengapa mereka menerapkan bahasa untuk melarang impor dan variabel yang tidak digunakan, tetapi menurut saya fitur ini mengganggu saat menulis kode saya. Untuk menyiasati ini, saya mengubah kompiler saya untuk mengizinkan flag opsional untuk mengizinkan variabel yang tidak digunakan dan impor dalam kode saya.

Jika Anda tertarik, Anda dapat melihatnya di https://github.com/dtnewman/modified_golang_compiler .

Sekarang, saya cukup menjalankan kode dengan perintah seperti go run -gcflags '-unused_pkgs' test.go dan tidak akan menampilkan kesalahan "impor yang tidak digunakan" ini. Jika saya mengabaikan flag ini, maka kembali ke default untuk tidak mengizinkan impor yang tidak digunakan.

Melakukan ini hanya membutuhkan beberapa perubahan sederhana. Go purists mungkin tidak akan senang dengan perubahan ini karena ada alasan bagus untuk tidak mengizinkan variabel / impor yang tidak digunakan, tetapi saya pribadi setuju dengan Anda bahwa masalah ini membuatnya kurang menyenangkan untuk membuat kode di Go, itulah sebabnya saya membuat perubahan ini pada saya. penyusun.

dtzvi.dll
sumber
2
Saya juga telah melakukan hal yang sama dengan rilis 1.6, periksa di sini jika tertarik: github.com/ronelliott/go/tree/release-branch.go1.6 CATATAN: beberapa pengujian akan gagal
Ron E
2
Saya suka ide di balik ini. Saya melihat bahwa garpu Anda masih di versi 1.2, yang membuatnya tidak berguna. Ini harus dimasukkan dalam kompiler go standar, paling tidak sehingga go run main.gomenonaktifkan kesalahan secara default, sementara go buildmengaktifkan kesalahan. Dengan begitu, mudah untuk dikembangkan menggunakan go rundan ketika saatnya membangun untuk produksi, Anda masih dipaksa untuk membersihkan kode Anda.
kramer65
17

Gunakan goimports . Ini pada dasarnya adalah garpu gofmt, yang ditulis oleh Brad Fitzpatrick dan sekarang termasuk dalam paket alat go. Anda dapat mengkonfigurasi editor Anda untuk menjalankannya setiap kali Anda menyimpan file. Anda tidak perlu mengkhawatirkan masalah ini lagi.

mdwhatcott.dll
sumber
5

Jika Anda menggunakan fmtpaket untuk pencetakan umum ke konsol saat Anda mengembangkan dan menguji maka Anda mungkin menemukan solusi yang lebih baik dalam paket log .

OldCurmudgeon
sumber
5
Atau fungsi bawaan printlnyang sepertinya selalu dilupakan orang.
MatrixFrog
2
@MatrixFrog Dalam jangka panjang, bukanlah ide yang baik untuk mengembangkan fungsi-fungsi ini karena mereka dapat menghilang seiring waktu. Menggunakan log adalah ide yang bagus karena Anda mungkin menyimpannya dan itu adalah bagian dari pustaka standar dan kemungkinan besar tidak akan dihapus. Lihat spesifikasi untuk detailnya.
nemo
1
Dibangun println?? Ini berita baru bagiku. Apakah itu tidak berdokumen? Saya tidak dapat menemukannya di mana pun.
Matt
1
@nemo bagus. Mereka sempurna untuk saat Anda perlu mencetak sesuatu dengan cepat, tetapi Anda tidak bermaksud untuk memeriksanya. Mungkin tidak baik untuk menggunakannya di kasus lain.
MatrixFrog
1
@MartinTournoij - Saya tidak setuju. Ini adalah solusi yang akhirnya saya temukan ketika saya mengalami masalah ini 5 tahun yang lalu dan dengan 5+ suara positif, itu jelas membantu orang lain. Saya adalah seorang pemula yang menggunakan fmtpaket untuk logging, tidak menyadari bahwa ada paket logging yang sudah jadi.
OldCurmudgeon
5

Gunakan if false { ... }untuk mengomentari beberapa kode. Kode di dalam tanda kurung harus benar secara sintaksis, tetapi bisa juga kode yang tidak masuk akal jika tidak.

topskip
sumber
3
Lebih dari benar secara sintaksis, variabel referensi apa pun (mis. Foo.Bar) harus ada, dll.
Dragon
Ini tidak terlalu bersih atau idiomatis. Ada alasan mengapa Go dirancang seperti itu
Acidic9
1
Ini adalah teknik yang bagus ketika seseorang hanya mencoba berbagai hal sambil mengembangkan skrip atau menjelajahi API di Golang. Terima kasih topskip!
Jay Taylor
2

Banyak orang telah berkomentar dengan justifikasi yang valid dan saya juga mengakui niat penulis asli. Namun, Rob Pike menyebutkan di berbagai forum bahwa Go adalah hasil dari penyederhanaan proses yang tidak dimiliki atau tidak mudah dicapai oleh beberapa bahasa pemrograman utama lainnya. Itu semantik bahasa Go dan juga untuk mempercepat kompilasi, banyak hal yang diadopsi yang awalnya terkesan tidak efisien.

Singkatnya, impor yang tidak terpakai dianggap sebagai kesalahan di Go karena program tersebut tidak berfungsi dan memperlambat kompilasi. Menggunakan impor untuk efek samping (_) adalah solusi, namun, saya merasa ini membingungkan pada saat ada campuran impor yang valid dengan efek samping bersama dengan efek samping yang diimpor murni untuk tujuan debugging / pengujian terutama ketika basis kode adalah besar dan ada kemungkinan untuk melupakan dan tidak menghapus secara tidak sengaja yang dapat membingungkan teknisi / pengulas lain nanti. Saya biasa mengomentari yang tidak terpakai, namun, IDE populer seperti kode VS dan Goland dapat digunakan goimportsdengan mudah yang melakukan penyisipan dan penghapusan impor dengan cukup baik. Silakan merujuk ke tautan untuk info lebih lanjut, https://golang.org/doc/effective_go.html#blank_import

sbcharr.dll
sumber
Terima kasih untuk ini! Saya sarankan untuk secara eksplisit menyalin-tempel baris kode dari URL yang Anda posting ke tanggapan Anda sebagai contoh konkret pengimporan untuk efek samping: import _ "net/http/pprof"
Dragon
1
Terima kasih @Dragon atas saran Anda! Karena saya adalah kontributor baru, dengan bantuan orang-orang seperti Anda, saya akan menjadi lebih baik dengan posting saya dengan cepat.
sbcharr
-1

letakkan ini di atas dokumen Anda dan lupakan impor yang tidak digunakan:

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

var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs
goen
sumber
1
Alih-alih membuat kompilator menghasilkan kode mati jika Anda benar-benar ingin melakukan ini, gunakan _variabel global sebagai gantinya (misalnya satu paket per baris atau jika Anda bersikeras, semuanya seperti var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs:). Tapi jangan lakukan ini, gunakan saja goimports.
Dave C