Advertisement
  1. Code
  2. Go
Code

3 адрозненні Go

by
Difficulty:IntermediateLength:MediumLanguages:

Belarusian (беларуская мова) translation by Alex Grigorovich (you can also view the original English article)

Go - гэта спецыяльная мова. Яна новая ў сваім падыходзе да праграмавання і ў прынцыпах якая яна выкарыстоўвае. Гэтаму спрыяла тое, што некаторыя з стваральнікаў мовы вынаходнікаў піянеры C. Агульная адчуванне Go, гэта C 21-га стагоддзя.

У гэтым уроку вы даведаецеся пра тры асаблівасцях, якія робяць Go унікальным: гэта яго прастата, мадэль паралеляў з дапамогай goroutines і механізм апрацоўкі памылак.

1. Прастата

Многія паспяховыя сучасныя мовы, такія як Scala і Rust вельмі магутныя і прапануюць прасунутыя сістэмы тыпаў і сістэмы кіравання памяццю. Гэтыя мовы ўзялі за аснову папулярныя языкі іхнія часу, такіх як C ++, Java і C # і дадалі або палепшылі іх магчымасці. Go ідзе па іншым шляху і выключае шматлікія асаблівасці і магчымасці.

Няма шаблонау

Універсальныя шаблоны ці проста шаблоны з'яўляюцца асновай шматлікіх моў праграмавання. Яны часта ўсё ўскладняюць, а паведамленні пра памылку, звязанай з шаблонамі часам могуць быць незразумелымі. Дызайнеры Go вырашылі абысціся без гэтага.

Гэта, магчыма, самае спрэчнае рашэнне стваральнікаў Go. Асабіста я бачу шмат добрага ў шаблонах і веру, што гэта можа быць зроблена правільна (гл. C #, як прыклад добрых шаблонаў зробленых правільна). Спадзяюся, што ў будучыні, шаблоны будуць выкарыстоўвацца ў Go.

Без выключэнняў

Апрацоўка памылак мовы Go абапіраецца на коды выключэнняў. Каб аддзяліць статус ад выніку функцыі, Go падтрымлівае множныя вяртаюцца значэння ў функцыях.  Гэта даволі незвычайна. Я раскажу пра гэта больш падрабязна крыху пазней, ніжэй невялікі прыклад:

Адзін выкананы файл

У Go няма асобнай выкананай бібліятэкі. Ён генеруе адзін выкананы файл, які можна разгарнуць толькі шляхам капіявання (тыпа разгортванне XCOPY). Гэта так жа проста, як і выглядае. Не трэба турбавацца пра залежнасці або неадпаведнасцях версій. Гэта вялікае цуд для кантэйнернага разгортвання (Docker, Kubernetes і яго прыяцеляў). Адзін выкананы файл спрашчае працу з Dockerfiles.

Няма дынамічных бібліятэк

Выдатна. Гэта нядаўна змянілася ў Go 1.8. Цяпер вы можаце загружаць дынамічныя бібліятэкі з дапамогай пашырэнняў.  Але, так як гэтая магчымасць не была прадстаўлена ў Go спачатку, я ўжываю пашырэнне толькі ў адмысловых выпадках. Сутнасць Go ў статычна скампіляваныя выкананым файле. Гэта даступны толькі для Linux.

2. Goroutines

Goroutines, магчыма, найбольш прывабны аспектам Go з практычнага пункту гледжання. Goroutines дазваляюць выкарыстаць усю моц шмат'ядравых машын у вельмі зручнай для карыстальнікаў форме.  Гэта створана на базе тэарэтычных распрацовак, і які забяспечвае сінтаксіс вельмі радуе.

CSP

Аснова мадэлі паралеляў ў Go з'яўляецца C. A. R. Сувязі паслядоўных працэсаў Hoar.  Ідэя заключаецца ў тым, каб пазбегнуць сінхранізацыі праз агульную памяць паміж некалькімі патокамі выканання, якая з'яўляецца працаёмкім працэсам і прыводзіць да памылак. Замест гэтага ўзаемадзеянне праходзіць праз каналы, якія пазбягаюць суперніцтва.

Выклік функцыі як Goroutine

Любая функцыя можа быць выклікана як goroutine праз ключавое слова go. Разгледзім наступную лінейную праграму.  Функцыя foo () бяздзейнічае некалькі секунд і выводзіць колькі секунд яна "спала". У гэтай версіі, кожны выклік foo () блакуецца да наступнага выкліку.

Вынік адпавядае парадку выклікаў у кодзе:

Цяпер я зраблю невялікія змены і дадам ключавое слова «go» да першых трох выклікаў:

Вынік зараз адрозніваецца. 1 другі выклік заканчвае першым і выводзіць на экран «1s», затым ідуць «2s» і «3s».

Звярніце ўвагу, што 4 другі выклік не з'яўляецца goroutine. Так і задумана, таму праграма чакае і дазваляе goroutines спыніцца на гэтым. Без яго праграма завершыцца адразу пасля запуску goroutines. Існуюць розныя спосабы акрамя "засынання" пачакаць пакуль goroutine завершыць выкананне.

Сінхранізацыя Goroutines

Яшчэ адзін спосаб чакання пакуль goroutines завершыць выкананне, гэта выкарыстанне груп сінхранізацыі. Вы аб'яўляеце аб'ект чакання групы і перадаеце яго ў кожны goroutine, які адказвае за выклік метаду Done (), калі задача выканана. Затым вы чакаеце групы сінхранізацыі. Вось код, які адаптуе папярэдні прыклад для выкарыстання яго як групы чаканні.

Каналы

Каналы дазваляюць goroutines (і вашу галоўную праграму) абменьвацца інфармацыяй. Вы можаце стварыць канал і перадаць яго ў goroutine. Стваральнік можа запісваць у канал, а goroutine можа чытаць з канала.

Гэта працуе і ў адваротным кірунку. Go падае "смачны" сінтаксіс для каналаў, са стрэлкамі, для ўказанні патоку інфармацыі.  Вось іншы варыянт адаптацыі нашай праграмы, у якім goroutines атрымліваюць каналы, у які яны робяць запіс, калі выконваюць працэдуру, а галоўная праграма перад завяршэннем чакае паведамленне ад усіх goroutines.

Пішам Goroutine

Гэта свайго роду трук. Напісанне goroutine такое ж, як і напісанне любой функцыі. Паглядзіце функцыю foo () вышэй, якая выклікаецца ў праграме як goroutine, і як звычайная функцыя.

3. Апрацоўка памылак

Як я згадваў раней, апрацоўка памылак у Go адрозніваецца. Функцыі могуць вяртаць множныя значэнні, і ўзгодненымі функцыямі, якія могуць не вяртаць аб'ект памылкі, як іх апошняе значэнне.

Існуе таксама механізм, які нагадвае выключэння з дапамогай функцый panic() і recover(), але гэта лепш за ўсё падыходзіць для асаблівых сітуацый. Вось тыповы сцэнар апрацоўкі памылак, дзе функцыя bar() вяртае памылку, і функцыя main() правярае, ці адбылася памылка і друкуе яе.

Абавязковая праверка

Калі вы прысвоілі зменнай памылку і не праверылі яе, Go знервуецца.

Ёсць шляхі вакол гэтага. Вы можаце проста не прызначыць памылку заусім:

Ці можна прызначыць яе праз падкрэсліванне:

Моўная падтрымка

Памылкі гэта значэння, якія вы можаце прапускаць свабодна. Go прадастаўляе невялікую падтрымку памылак, абвяшчаючы інтэрфейс памылак, які патрабуе метад па імі Error() і вяртае радок:

Існуе пашырэнне errors, якое дазваляе вам ствараць новыя аб'екты памылак. Пашырэнне fmt прадастаўляе функцыю Errorf() для стварэння фарматаваных аб'ектаў памылкі. Гэта пра яго.

Узаемадзеянне з Goroutines

Вы не можа вяртаць памылкі (або любы іншы аб'ект) з goroutine. Goroutines могуць звязваць памылкі са знешнім светам праз пасярэднікаў. Перадача канала памылкі ў goroutine лічыцца добрай практыкай. Goroutines таксама могуць запісваць памылкі ў файлы часопіса або ў базу дадзеных або выклікаць выдаленыя службы.

Заключэнне

Go набыў велізарны поспех і дынаміку за апошнія гады. Гэта мова "ісці і глянь" (гл. Тое, што я там зрабіў), для сучасных размеркаваных сістэм і баз дадзеных. У яго ёсць шмат распрацоўнікаў якія перайшлі з мовы Python.

Большая частка яго несумненна тлумачыцца падтрымкай кампаніі Google. Але Go вызначана "стаіць на сваім".  Яго падыход да распрацоўкі асноўных моваў вельмі адрозніваецца ад іншых сучасных моў праграмавання. Дайце яму шанец. Яго вельмі лёгка асвоіць і весела праграмаваць.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.