Tools

20.11.2014

Интересни неща в go toolkit-а

Test coverage

go get golang.org/x/tools/cmd/cover
go test -cover
go test -coverprofile <filename> 
go tool cover -html <coverage_file>

goimports

go get golang.org/x/tools/cmd/goimports
goimports -w .

go fix

Спомняте ли си как ви казахме че след версия 1.0 авторите са обещали, че каквото работи на 1.x ще работи на 1.y, където x < y ?

Е да ама ... понякога се налага да се променят основни API-та. До тук има два(2) фикса за от 1.0 насам.

И двата са за използване на ненаимeновани инициализации на структове

Student{12345, "Пешо Пешов"}

вместо

Student{faculty_number: 12345, name: "Пешо Пешов"}

Ако след ъпдейт на go не ви се компилира проекта, можете просто да рънете:

go fix .

Все пак понякога се правят по специални промени, за които това няма да помогне.

go vet

Статичен анализатор на go код, който може и да ви спести малко главоболия.

Някои поддържани проверки:

golint

Lint за go от google.

go get github.com/golang/lint/golint

И го викаме с : (drum rolls)

golint .

gorename

go get golang.org/x/tools/cmd/gorename

С даден файл

gorename -from filename.go::NameOfSomething -to NewNameOfSomething

само разпознава какво е Something и го преименува в правилните файлове.

Или

gorename -from '"site.com/package/path".structName[.MethodName]' -to NewNameOfSomething

Преименува дадения идентификатор по даден пакет и идентификатор.

Навярно няма да го ползвате ръчно.

Oracle

Вие питате, а той ви отговаря на въпроси относно кода ви.

Не се ползва ръчно - или поне не лесно.

build tags (restrictions)

// +build tagname

някъде в началото на файла още преди package

сигнализират на компилатора при какви обстоятелства да компилира или да не компилира даден файл

// +build linux
// +build !386

казва само под linux , но не под 386

go build -tag tagname

go generate (new in 1.4)

Kъм момента списъка от команди включва:

//go:generate command args...

в началото на някой go файл който ще се компилира

go template

Интеграция с редактори

Повечето tool-ве описане до тук са писани с идеята, че ще бъдат интегрирани или поне с възможността да бъдат интегрирани в един или друг текстов редактор и цялостно IDE.

Общото между двата и причината да не ви показваме как се ползват ръчно е, че и двата работят с byte offset, а не с номера на редове.

Command-line аргументи

import "flag"

var stringVar string

func init() {
    flag.StringVar(&stringVar,  "paramName", "help message")
}

func main() {
    flag.Parse()
    // do something with stringVar
}

Въпроси?