Go tutorial: Започнете с Google Go

Защо искате да използвате езика Go? По принцип това е сбит, прост, безопасен и бързо компилиран език с прекрасни паралелни функции и лесно се справя с големи проекти. Освен това е безплатен с отворен код, въпреки че първоначално е разработен в Google.

Според Роб Пайк, един от дизайнерите на езика, „целите на проекта Go бяха да премахне бавността и непохватността на разработката на софтуер в Google и по този начин да направи процеса по-продуктивен и мащабируем. Езикът е проектиран от и за хора, които пишат и четат, отстраняват грешки и поддържат големи софтуерни системи. "

В съответствие с тези цели, Go липсва много функции на някои други известни езици - и това всъщност е сила. Go не е обектно-ориентиран, няма заглавни файлове или декларации за препращане, няма йерархия на типа, няма претоварване на метод или оператор, няма генерични данни, няма виртуална машина за изпълнение, тя няма изключения и няма твърдения.

От друга страна, това, което има Go, работи доста добре. Той може да компилира големи програми за няколко секунди. Той има съпроводителни програми с ниско ниво (наречени goroutines ), които могат да комуникират ефективно чрез канали . Той има интерфейси и състав на интерфейса. Освен това Go поддържа първокласни функции, функции от по-висок ред, дефинирани от потребителя типове функции, функционални литерали, затваряния и множество връщани стойности - с други думи, поддържа функционален стил на програмиране на силно типизиран език.

Ако искате да поискате някоя от липсващите функции, които споменах по-горе, може да искате да прочетете дискусията за езиковите промени в често задаваните въпроси за езика Go: отговорът обикновено е „Не, защото ...“ Като цяло най-добрите програми Go проектиран от нулата да използва езикови функции на Go, вместо да бъде преведен буквално от други езици, които използват различни абстракции.

Инсталирайте Go

Кратките инструкции за инсталиране на Go се появяват в хранилището на източника. Можете да изтеглите двоични версии на Go за Windows, MacOS и Linux или да инсталирате Go от източник. Ще намерите инструкции за инсталиране на Go от източника на GitHub.

Ако вече сте инсталирали Go, трябва да проверите текущата версия на компилация в долната част на //golang.org/ и след това да проверите инсталираната версия от командния ред:

$ go версия

Ако вашата инсталация е остаряла, изтеглете и инсталирайте текущата версия. Рестартирайте всички отворени командни подкани (Windows) или терминали. Повторете go versionи се уверете, че версията е това, което сте очаквали; в противен случай може да има инсталирана другаде по-стара версия на Go, която трябва да бъде премахната.

(Не, не съм параноик. Успях да вляза в ситуацията, която описах, като използвах Homebrew, за да инсталирам една версия, и стандартния пакет MacOS, за да инсталирам следващата версия около месец по-късно. Те се инсталират на различни места в $PATH. След като разбрах какво се е случило, успях да деинсталирам старата версия с Homebrew.)

Друга опция за инсталиране, ако искате поддръжка и обезщетение и сте в състояние да платите, е да използвате ActiveGo.

След като инсталирате компилатора Go и инструментите, трябва да преминете през упражнението за компилиране и стартиране на програма Go, както е описано в раздела „Тествайте вашата инсталация“ на страницата за инсталиране.

Настройте вашата среда Go

Отиди програмисти обикновено държат всичките си код в едно работно място, с bin, pkgи srcпапки. Във всяка папка проектите обикновено имат пътища, свързани с Git хранилища, като GitHub или GitLab. Например, запазвам целия си езиков код Go ~/workи настройвам GOPATHпроменливата на средата на $HOME/work. Пътят до моята папка "hello.go" с изходен код е $GOPATH/src/github.com/meheller/hello.

Също така добавям GOPATH/binдиректорията към пътя си, за удобство при стартиране на програми Go от всяка директория:

износ GOPATH = $ HOME / работа

износ PATH = $ PATH: $ (go env GOPATH) / bin

Помощните програми за езика Go ще се инсталират GOPATHпо подразбиране, така че поставянето на GOPATH/binдиректорията на пътя също улеснява намирането на вас и редакторите и IDE, които знаят Go. Можете да инсталирате повечето помощни програми, $go get след като разберете кои са ви необходими и пътищата им в хранилището. Хранилищата обикновено са лесни за намиране с търсене с Google. В някои случаи приставка за редактор за Go ще инсталира помощните програми (напр. gocode) Автоматично.

Ако не го настроите сами, по GOPATHподразбиране е за $HOME/goUnix и MacOS и %USERPROFILE%/goза Windows.

Go езикови инструменти, редактори и IDE

Няколко помощни програми Go са инсталирани като част от пакета със компилатора. Други могат да бъдат инсталирани с go getкомандата. Най-често използваните помощни програми за командния ред са изброени по-долу.

 
Име Синопсис
go Управлява изходния код на Go и изпълнява останалите команди, изброени тук.
cgo Позволява създаването на пакети Go, които извикват C код.
cover Програма за създаване и анализ на профили на покритие, генерирани от go test -coverprofile.
fix Намира Go програми, които използват стари функции на езика и библиотеките и ги пренаписва, за да използват по-нови.
fmt Формати Go пакети. Предлага се и като независима gofmtкоманда с по-общи опции.
godoc Извлича и генерира документация за пакети Go.
vet Проверява изходния код на Go и отчита подозрителни конструкции, като Printfповиквания, чиито аргументи не са в съответствие с низа на формата.

Обичайният начин за обявяване на повечето от тези команди е като подкоманди на go, например go fmt. Други трябва да бъдат извикани чрез go toolподкомандата. При моята инсталация go toolвръща следния списък с известни инструменти:

$ go инструмент

addr2line

asm

buildid

cgo

компилиране

Покрийте

дист

док

поправяне

връзка

нм

objdump

опаковка

pprof

test2json

обиколка

проследяване

ветеринар

Тези инструменти са документирани като част от пълния списък на командите Go. Между другото, уверете се, че вашата GOPATHнастройка е настроена, преди да добавите каквито и да било инструменти на Go или приставки за редактор на Go, които използват инструментите Go.

В хранилището Go липсва никаква поддръжка на редактор или IDE от версия 1.4, но има много и двамата, които знаят за Go, или извън кутията, или с модули за добавяне. Обсъдих много от тях в статия от 2017 г .; има и неофициален списък, поддържан от общността Golang.

Любимите ми IDE на Go език са GoLand (показан по-горе; преименуван от Gogland, откакто написах статията през 2017 г.) и Komodo. И двамата са платени продукти с безплатни пробни версии.

Ще искате да инсталирате Delve for Go за отстраняване на грешки. В MacOS може да се наложи да добавите помощни програми за командния ред към Xcode и евентуално да добавите мека връзка към debugserver, както е описано в коментара от 5 юни в списъка с проблемите на Delve. Бягането xcode-select --installсъщо ще поправи проблеми с намирането debugserver, макар и по груб начин.

Любимите ми редактори с графичен потребителски интерфейс са Atom и Visual Studio Code; и двете са безплатни. Ако изберете Atom, помислете за добавяне на пакетите go-plus и go-debug; ако изберете Visual Studio Code, помислете за добавяне на vscode-go.

Ако сте твърд потребител на Vim или Emacs, тогава непременно останете с това, което знаете - не че дори бих могъл да отвлека редактора ви от студените ви мъртви ръце. Vim-go добавя поддръжка на Go език за Vim, а go-mode добавя поддръжка на Go език за Emacs.

Обиколка на Go

Можете да научите доста малко, като преминете през „Обиколка на движение“, онлайн или офлайн. Ако приемем, че сте завършили локалната инсталация на компилатора и инструменти Go, можете да инсталирате обиколката, която да се изпълнява локално, като изпълните тези две команди:

$ go вземете golang.org/x/tour/gotour

$ gotour

Вторият ред трябва да стартира уеб сървър и да отвори прозорец на браузъра. Това ще изглежда точно като онлайн турнето, но може да се изпълни малко по-бързо, защото изгражда и изпълнява кодовите проби на вашата собствена машина. Натиснете Ctrl-C в командния прозорец, за да спрете сървъра, когато сте готови.

Обиколката е разделена на три секции. Искам да преминете през цялото турне, включително викторините, но ще обобщя всеки раздел по-долу като общ преглед и ще ви задам няколко въпроса. Давам отговорите на въпросите си в края на статията (без надникване!). 

Отидете на основите на езика

Go Basics Урок 1

Въпрос 1. В този пример има три пакета. Какви са те и как се използват? Защо програмата винаги връща един и същ номер, въпреки че има randфункция?

Имайте предвид, че не съм извикал Урок 2. Не пропускайте уроци само защото не съм ги коментирал.

Go Basics Урок 3

Ако стартирате този пример, ще видите съобщения за грешка:

prog.go: 9: 14: не може да се позовава на неизнесено име math.pi

prog.go: 9: 14: undefined: math.pi

Въпрос 2. Защо грешките? Как можете да поправите програмата?

Go Basics Урок 4

Въпрос 3. Сравнете тази декларация с еквивалента в C. Какво е различното?

Go Basics Урок 8

Въпрос 4. Защо тази програма не извежда грешки?

Go Basics Урок 10

Въпрос 5. Какъв е видът на k? Защо? Ако типът не е очевиден, погледнете урок 11, за да разберете как да го покажете.

Go Basics Урок 12

Този урок отговаря на въпроса, който зададох в Урок 8.

Отидете на Управление на потока Урок 1

Въпрос 6. С какво това се различава от forцикъла във вашия любим език? Смятате ли, че са необходими другите циклични конструкции на вашия любим език? Допълнителната информация в следващите три урока променя ли ви мнението?

Урок 7 за контрол на потока

Преди да стартирате тази програма, бюрото я проверете и запишете какво мислите, че ще отпечата. Стартирайте програмата. Беше ли прав? Ако не, какво не разбрахте?

Урок 8 за управление на потока

Това е упражнението, което може да получите в началото на интервю за бяла дъска. Време за себе си, докато го работи. Кажете какво мислите, докато преодолявате проблема.

Въпрос 7. Останалата част от секцията за управление на потока е важна за разбиране. След като преминете през уроци от 9 до 13, обяснете Go switchи deferизявленията по начин, по който програмист на C, Java или JavaScript би могъл да пипне.

Отидете на повече типове Урок 1

Преди да стартирате тази програма, бюрото я проверете и запишете какво мислите, че ще отпечата. Стартирайте програмата. Беше ли прав? Ако не, какво не разбрахте?

Как се чувствате, когато Go има указатели, но не и аритметика на показалеца?

Работете в раздела „Още типове“, докато стигнете до упражнението в Урок 18. Въпрос 8. Какво научихте за масивите и резените Go? Сега завършете упражнението.

Продължете през упражнението в урок 23.

Въпрос 9. Обяснете движение map. Защо искате да използвате такъв?

Завършете раздела Още типове.

Въпрос 10. Може ли Go да се използва като функционален език за програмиране, въпреки че е компилиран? Кога и защо бихте използвали затваряне?

Go методи и интерфейси

Преминете през всичките 25 урока в този раздел, започвайки с //tour.golang.org/methods/1.

Въпрос 11. Когато сте готови, обяснете как използването на методите и интерфейсите на Go се различава от класовете C ++. Кое ви харесва повече? Защо?

Отидете едновременно

Горутината е една от определящите характеристики на Go за едновременност. В първия урок в раздела за съвпадение, опитайте се да проверите програмата (по-долу) и запишете какво мислите, че ще отпечата.

Стартирайте програмата. Беше ли прав? Обяснете какво всъщност се случва и защо.

Каналите са начинът за имплицитна синхронизация на програми. В следващия урок (по-долу) опитайте отново да проверите програмата, преди да я стартирате.

Въпрос 12. Защо в този пример има само един канал, въпреки че има две повиквания на goroutine?

Операторът select позволява на goroutine да изчака при множество комуникационни операции. Какъв е редът, в който извлеченията се изпълняват в програмата по-долу?

Упражнението върху еквивалентни двоични дървета е друго, което може да срещнете в интервю за бяла дъска. Отделете време и обяснете своето мислене, докато прилагате решение. По същия начин направете упражнението за внедряване на уеб робот, сякаш сте на интервю.

Отговори на въпроси Go

Отговор 1. Пакетите се обозначават от packageинструкцията за текущата програма и от importинструкцията за използваните външни пакети. В тази проста програма mainе собственият пакет на програмата и се импортира, fmtтака че да може да печата и math/ randтака че да може да генерира произволно число.

Различните методи randразчитат на времето на часовника за генериране на случайни числа, но времето е фиксирано в gotourоколната среда. Като последващо упражнение намерете пакета и метода, които отчитат времето (подсказка: погледнете тук, ако се забиете), и го използвайте, за да отпечатате текущото време. Стартирайте това няколко пъти в gotourоколната среда, а също така изградете програмата локално и я стартирайте няколко пъти на собствената си машина.

Отговор 2. Експортирането в Go винаги трябва да се изписва с главни букви и езикът е чувствителен към малки и големи букви. math.Piе правилният метод.

Отговор 3. В декларациите за променливи C / C ++ следвайте формата (например int i, j, k;), докато в Go типът върви след името на променливата и може да бъде пропуснат, стига да може да се направи извод за типа. В C / C ++ типът на връщане предшества името на функцията, докато в Go то идва след списъка с параметри на функцията и преди тялото на функцията. В C / C ++ последващите запетая са задължителни.

Отговор 4. Той не изхвърля грешки, защото променливите Go, които не са настроени по друг начин, се инициализират до нулевата стойност на типа, например 0или false. В C / C ++ компилаторът отбелязва неинициализирани променливи.

Отговор 5.k е цяло число, тъй като е инициализирано в 3.