Domyślnie Go traktuje nieużywany import jako błąd, zmuszając cię do usunięcia importu. Chcę wiedzieć, czy jest jakaś nadzieja na zmianę tego zachowania, np. Zredukowanie go do ostrzeżenia.
Uważam, że ten problem jest wyjątkowo irytujący, uniemożliwiając mi cieszenie się kodowaniem w Go.
Na przykład testowałem kod, wyłączając segment / funkcję. Niektóre funkcje z biblioteki nie są już używane (np. Fmt, błędy, cokolwiek), ale będę musiał ponownie włączyć tę funkcję po krótkim testowaniu. Teraz program nie będzie się kompilował, dopóki nie usunę tych importów, a kilka minut później muszę ponownie zaimportować bibliotekę.
Robiłem ten proces wielokrotnie podczas tworzenia programu GAE.
var _ = <module>.Function
działa dobrze i jest na tyle rzucająca się w oczy, że nie jest powszechną praktyką.goimports
jako krok w procesie budowania. Bez żadnego z nich szybko się starzeje.Odpowiedzi:
Dodanie podkreślenia (
_
) przed nazwą pakietu zignoruje nieużywany błąd importu.Oto przykład, jak możesz go użyć:
import ( "log" "database/sql" _ "github.com/go-sql-driver/mysql" )
Zobacz więcej na https://golang.org/ref/spec#Import_declarations
źródło
_
(w przeciwnym razie nie można się odwołać do pakietu, ponieważ nie ma on nazwy). Jeśli masz zamiar to zrobić, równie dobrze możesz to skomentować / odkomentować.var _ = ...
Sztuczka nie ma tego problemu."fmt"
w Gogland, automatycznie dodaje,"fmt"
więc masz oba_"fmt"
i"fmt"
, co czyni je bezużytecznymi w tym IDETutaj
var _ = fmt.Printf
sztuczka jest pomocna.źródło
import
instrukcji iz powrotem, gdy tylko próbujesz kompilować lub testować jakiś plik z kodem, który jest iteracyjnie uzupełniany.Mam ten sam problem. Rozumiem powód, dla którego zaimplementowali język, aby uniemożliwić nieużywane importy i zmienne, ale osobiście uważam tę funkcję za irytującą podczas pisania mojego kodu. Aby to obejść, zmieniłem ustawienia mojego kompilatora, aby zezwolić na opcjonalne flagi zezwalające na nieużywane zmienne i importy w moim kodzie.
Jeśli jesteś zainteresowany, możesz to zobaczyć na https://github.com/dtnewman/modified_golang_compiler .
Teraz mogę po prostu uruchomić kod za pomocą polecenia, takiego jak go run -gcflags '-unused_pkgs' test.go i nie spowoduje to wyświetlenia tych błędów „nieużywanego importu”. Jeśli pominę te flagi, powróci do wartości domyślnej, która nie zezwala na nieużywane importy.
Wymagało to tylko kilku prostych zmian. Puryści Go prawdopodobnie nie będą zadowoleni z tych zmian, ponieważ jest dobry powód, aby nie zezwalać na nieużywane zmienne / importy, ale osobiście zgadzam się z Tobą, że ten problem sprawia, że kodowanie w Go jest znacznie mniej przyjemne, dlatego wprowadziłem te zmiany w moim kompilator.
źródło
go run main.go
domyślnie wyłączać błędy, ago build
włączać błędy. W ten sposób programowanie przy użyciu jest łatwe,go run
a kiedy nadejdzie czas na kompilację do produkcji, nadal będziesz zmuszony wyczyścić kod.Użyj goimports . Jest to w zasadzie rozwidlenie
gofmt
, napisane przez Brada Fitzpatricka, a teraz zawarte w pakietach narzędzi go. Możesz skonfigurować swój edytor, aby uruchamiał go za każdym razem, gdy zapiszesz plik. Nigdy więcej nie będziesz musiał martwić się tym problemem.źródło
Jeśli używasz
fmt
pakietu do ogólnego drukowania na konsoli podczas programowania i testowania, możesz znaleźć lepsze rozwiązanie w pakiecie dziennika .źródło
println
której ludzie zawsze zapominają.println
?? To dla mnie nowość. Czy to nie jest udokumentowane? Nie mogę go nigdzie znaleźć.fmt
pakietu do logowania, nieświadomym, że istnieje gotowy pakiet do logowania.Służy
if false { ... }
do komentowania kodu. Kod w nawiasach klamrowych musi być poprawny składniowo, ale w przeciwnym razie może być kodem bezsensownym.źródło
Wiele osób już skomentowało, podając ważne uzasadnienie, a ja również zgadzam się z intencją oryginalnego autora. Jednak Rob Pike wspomniał na różnych forach, że Go jest wynikiem uproszczenia procesów, których brakuje kilku innym głównym językom programowania lub które nie są łatwe do osiągnięcia. To semantyka języka Go, a także przyspieszenie kompilacji, jest wiele rzeczy, które są przyjmowane, co początkowo wydaje się nieefektywne.
Krótko mówiąc, nieużywane importy są traktowane jako błędy w Go, ponieważ blokuje program i spowalnia kompilację. Użycie importu dla efektu ubocznego (_) jest obejściem, jednak wydaje mi się to mylące, gdy istnieje mieszanka prawidłowych importów z efektami ubocznymi wraz z efektami ubocznymi importowanymi wyłącznie w celu debugowania / testowania, zwłaszcza gdy kod jest jest duży i istnieje szansa, aby zapomnieć i nie usunąć nieumyślnie, co może później zmylić innych inżynierów / recenzentów. Kiedyś komentowałem nieużywane, jednak popularne IDE, takie jak kod VS i Goland, mogą z
goimports
łatwością używać, co całkiem dobrze wykonuje wstawianie i usuwanie importu. Więcej informacji można znaleźć w linku https://golang.org/doc/effective_go.html#blank_importźródło
import _ "net/http/pprof"
umieść to na swoim dokumencie i zapomnij o niewykorzystanych importach:
import ( "bufio" "fmt" "os" "path/filepath" ) var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs
źródło
_
zamiast tego zmiennych globalnych (np. Jeden pakiet w wierszu lub jeśli nalegasz, wszystkie razem, jakvar _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs
:). Ale nie rób tego, po prostu użyjgoimports
.