Как в Go може да направим сървър, говорещ HTTP 1.0, 1.1 и 2?
ListenAndServeTLS() от http пакета
Кой е "най-важния" сървърен интерфейс в http пакета?
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
Какво е http.Request и за какво се ползва?
Method, URL и др.http.Clienthttp.Handler
Какво представлява http.ServeMux?
http.Handler интерфейса
go, съдържащ пакети ast, parser, build и др.Вече сме говорили за някои от вградените инструменти:
go build , go run , go install и go getgo testgo docgo fmtgo -hgo test -cover
go test -coverprofile <filename> go tool cover -html <coverage_file> -o <html_result>
covermode опцията може да определим как се смята покритието. Възможните опции са set,count и atomic
$ go test -race mypkg // test the package $ go run -race mysrc.go // compile and run the program $ go build -race mycmd // build the command $ go install -race mypkg // install the package
go get -u golang.org/x/tools/cmd/goimports
goimports -w .
Спомняте ли си как ви казахме че след версия 1.0 авторите са обещали, че каквото работи на 1.x ще работи на 1.y, където x < y ?
Е да ама ... понякога се налага да се променят основни API-та.
Ако след ъпдейт на go не ви се компилира проекта, можете просто да рънете:
go fix .
Все пак понякога се правят по специални промени, за които това няма да помогне.
Статичен анализатор на go код, който може и да ви спести доста главоболия. Проверява за често срещани грешки във вашия код и се оплаква, ако ги намери.
Някои поддържани проверки:
"Официален" linter за Go от Google. Показва стилистични грешки.
go get -u github.com/golang/lint/golint
И го викаме с : (drum rolls)
golint .
или
golint ./...
gometalinter обединява и унифицира много различни вградени и външни инструменти за анализ на кода
go get -u github.com/alecthomas/gometalinter gometalinter --install --update
Включва:
go fmt , go vet , golint и goimports
... и други! Прекалено тежко е да се се пуска всичко на всеки filesave, за разлика от gofmt, goimports или golint.
Безценен е обаче като метрика и част от CI процес.
godoc.org/github.com/docker/libnetwork
goreportcard.com/report/github.com/docker/libnetwork
gocover.io/github.com/docker/libnetwork
Позволява прецизно type-safe преименуване на неща в кода
go get -u golang.org/x/tools/cmd/gorename
С даден файл
gorename -from filename.go::NameOfSomething -to NewNameOfSomething
само разпознава какво е Something и го преименува в правилните файлове.
Или
gorename -from '"site.com/package/path".structName[.MethodName]' -to NewNameOfSomething
Преименува дадения идентификатор по даден пакет и идентификатор.
Навярно няма да го ползвате ръчно.
go get -u golang.org/x/tools/cmd/guru
Вие питате, а той ви отговаря на въпроси относно кода ви.
Не се ползва ръчно - или поне не лесно.
Повечето tool-ве описане до тук са писани с идеята, че ще бъдат интегрирани или поне с възможността да бъдат интегрирани в един или друг текстов редактор и цялостно IDE.
Общото между двата и причината да не ви показваме как се ползват ръчно е, че и двата работят с byte offset, а не с номера на редове.
В go има едно нещо наречено build tag-ове или build restrictions
Представлят подобен коментар някъде в началото на файла (още преди package):
// +build tagname
Сигнализират на компилатора при какви обстоятелства да компилира или да не компилира даден файл
// +build linux // +build !386
казва само под linux, но не под 386
Може да подаваме наши тагове с:
go build -tag tagname
Mожете да укажeте, че искате дадена друга команда да бъде изпълнена върху кода. Use cases:
String() методи на константиКазвате какво и как искате да се пусне, като в началото на някой .go файл слагате:
//go:generate command args...
И след това извиквате
go generate ./...
os.Argsflag ту дъ рескюimport "flag"
var stringVar string
func init() {
flag.StringVar(&stringVar, "paramName", "help message")
}
func main() {
flag.Parse()
// do something with stringVar
}import "github.com/keltia/leftpad" е много як feature на езикаleftpad изчезне?awesome-lib v2.0.5-test2?$GOPATH/src/github.com/keltia/leftpadleftpad, но може да не ни харесва...В Go има вграден profiler, който се използва така:
import _ "net/http/pprof"
И ако нямате HTTP сървър в програмата, трябва да дoбавите поне:
go func() {
http.ListenAndServe("localhost:6060", nil)
}()След това може да отидете на адреса и да разглеждате информация за heap-а, CPU usage, execution traces, горутини и др.
Може да се използва и вградения command-line tool:
go tool pprof http://localhost:6060/debug/pprof/heap