Geliştirme yapmaya başlamadan önce bazı yardımcı araçlara ihtiyacımız var.
Bunların başında da golangci-linter
geliyor.
Kurulumu;
https://golangci-lint.run/usage/install/#local-installation
adresinden takip ederek yapabilirsiniz. golangci-linter
çalışırken config
yaml dosyası arar, bu dosya belli lokasyonlarda olabilir. Genelde go.mod
dosyasının bulunduğu, projenin ROOT dizinine koyarız bu dosyayı.
Komut satırında, ROOT dizindeyken;
$ golangci-lint run
diyerek tüm kontrolleri çalıştırabilirsiniz. Eğer hata yoksa geriye hiçbir şey dönmez, bu durum işlerin yolunda olduğu anlamındadır.
Go, gofmt
komutu ile beraber gelir;
$ command -v gofmt
/opt/homebrew/opt/go/libexec/bin/gofmt
Bu araç sayesinde yazdığınız kodun otomatik olarak formatlanması, yani düzgün şekilde görünmesini sağlar:
$ gofmt -h
$ gofmt <dosya.go> # düzeltilmiş kodu stdout’a yazar
$ gofmt -w <dosya.go> # düzeltilmiş kodu <dosya.go> üzerine yazar
gofumpt
ise gofmt
’un daha da katı/kuralcı halidir ve aynı şekilde çalışır;
$ go install mvdan.cc/gofumpt@latest
$ gofumpt -h
$ gofumpt <dosya.go> # düzeltilmiş kodu stdout’a yazar
$ gofumpt -w <dosya.go> # düzeltilmiş kodu <dosya.go> üzerine yazar
Otomatik olarak import
ifadelerinin tamamlanması işini goimports
yapar;
$ go install golang.org/x/tools/cmd/goimports@latest
$ goimports -h
$ nano /tmp/main.go
Şimdi özellikle yamuk yumuk, import’u eksik bir go kodu:
package main
func main(){
fmt.Println("ok")
}
Şimdi;
$ gofmt /tmp/main.go # sadece stdout’a çıktı
package main
func main() {
fmt.Println("ok")
}
$ gofmt -w /tmp/main.go
$ gofumpt -w /tmp/main.go
$ goimports -w /tmp/main.go
$ cat /tmp/main.go
package main
import "fmt"
func main() {
fmt.Println("ok")
}
Go otomatik olarak girintileme için (indentation) TAB
kullanır. Gördüğünüz
gibi kod otomatik olarak düzeltildi.
golines
ile otomatik olarak uzun satırları daha okunur hale getirebiliriz.
$ go install github.com/segmentio/golines@latest
$ golines --help
$ golines -m 120 -w <dosya.go>
go vet
aslında go
ile built-in gelen, yine kodu analiz edip belli
düzeltmeleri bize söyler.
$ go vet ./... # tüm paketleri vet’le
$ go vet <PAKET> # <PAKET> vet’le
$ go vet github.com/vbyazilim/maoyyk2023-golang-101-kursu/src/15/mutex/kvstore # gibi
vet
yaparken yan araçlar da kullanırız: shadow
;
$ go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow@latest
$ shadow -h
shadow
bize istemeden yaptığımız Variable Shadowing’leri gösterir.
Özellikle if val, ok := function; !ok{}
gibi ifadelerde istemeden değişken
gölgeleme yapmış olabiliriz.
$ go vet -vettool "$(command -v shadow)" ./...
$ go vet -vettool "$(command -v shadow)" <PAKET>
Kullandığınız kod editörleri genelde tüm bu linter/checker işlerini otomatik olarak yapmanızı sağlar. Gerekli kurulumları yaptıktan sonra kod editörünüzü de ayarlamanız gerekir.
goimports
bazen hata yapar. Mesela uuid
paketi. Eğer başka projelerde;
github.com/gofrs/uuid
kullanmışsanız ve yeni projede
github.com/google/uuid
kulanırsanız, goimports
ilk bulduğu paketi otomatik
olarak takar :) Yani siz github.com/google/uuid
bulmasını beklerken diğerini
görürseniz elle düzeltme yapmak gerekir.
Kurulan tüm paketler;
$ cd $(go env GOMODCACHE)
altına clone (git clone
) edilir.