Back to site

Пытанні і адказы

Origins [Уверх]

Якая мэта праекта?

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

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

Што такое паходжанне назвы?

"Огл" будзе добрае назва для адладчыка Go.

Што паходжання талісман?

Талісмана і лагатыпа былі распрацаваны Рэнэ французская , які таксама спраектаваў Гленда , Plan 9 труса. Суслік з'яўляецца вытворным ад каго яна выкарыстоўваецца для WFMU майцы дызайн T некалькі гадоў таму. Лагатып і талісман пакрытыя Creative Commons Attribution 3,0 ліцэнзіі.

Якое імя 6g?

6G (і 8G і 5G) кампілятар названы ў традыцыях Plan 9 кампілятары C, апісаныя ў http://plan9.bell-labs.com/sys/doc/compiler.html (гл. табліцу ў раздзеле 2) . 6, архітэктуры ліст для amd64 (або x86-64, калі вы аддаеце перавагу), у той час як G абазначае Go.

Якая гісторыя гэтага праекта?

Роберт Griesemer, Роб Пайк і Кен Томпсан пачаў эскізаў мэтаў для новага мовы на белай дошцы ад 21 верасня 2007 года. На працягу некалькіх дзён мэтаў пасяліліся ў план, каб зрабіць што-то і дакладнае ўяўленне аб тым, што яна будзе. Дызайн працягваў частку часу паралельна з незвязанымі працы. Да студзеня 2008 года, Кен пачаў працу над кампілятарам, з якой вывучыць ідэі, яна спарадзіла C код сваёй прадукцыі. Да сярэдзіны года мова стала поўны працоўны дзень праекта і пасяліліся дастаткова, каб спроба вытворчасці кампілятара. У траўні 2008 года, Иэн Тэйлар самастойна пачалі канцы GCC аддзел па справах ГА выкарыстаннем праекта спецыфікацыі. Кокс Русі ўступіў у канцы 2008 года і дапамаглі рухацца мова і бібліятэкі ад прататыпа да рэальнасці.

Многія іншыя падзяліліся сваімі ідэямі, абмеркавання і код.

Чаму вы ствараеце новы мову?

Перайсці нарадзіўся з-за засмучэнні з існуючымі мовы і асяроддзя праграмавання сістэмы. Праграмаванне стала занадта цяжкім і выбар моў быў часткова вінаваты. Трэба было выбраць альбо эфектыўнай кампіляцыі, эфектыўнае выкананне, або прастата праграмавання, і ўсе тры не былі даступныя на тым жа мове пануючай тэндэнцыі. Праграмісты, якія маглі б выбіралі прастату за бяспекай і эфектыўнасцю, пераехаўшы ў дынамічна типизированных моў, такіх як Python і JavaScript, а не C + + або, у меншай ступені, Java.

Перайсці з'яўляецца спроба аб'яднаць прастату праграмавання інтэрпрэтуецца, дынамічна типизированный мову з эфектыўнасцю і бяспекай статычна типизированный, кампіляваная мову. Ён таксама імкнецца быць сучасным, з падтрымкай сеткавых і шмат'ядравых вылічэнняў. Нарэшце, ён прызначаны для хуткай: яна павінна прымаць не больш за некалькі секунд, каб пабудаваць вялікі выкананы на адным кампутары. Для дасягнення гэтых мэтаў неабходна рашэнне шэрагу моўных пытанняў: выразныя, але лёгкі тып сістэмы; паралелізму і вываз смецця; жорсткія спецыфікацыі залежнасць, і гэтак далей. Яны не могуць быць разгледжаны таксама ў бібліятэках або прылады, новы мова называўся для.

Якія продкі Go's?

Перайсці ў асноўным у сям'і C (асноўны сінтаксіс), са значным удзелам Pascal / Modula / Oberon сям'і (дэкларацыі, пакеты), а таксама некаторыя ідэі з моў натхнёны CSP Тоні Хоара, такіх як Newsqueak і лімбу (паралелізму). Аднак, гэта новы мову па ўсіх напрамках. Ва ўсіх адносінах мову быў распрацаваны, думаючы аб тым, што праграмісты рабіць і як зрабіць праграмаванне, па меншай меры выгляд праграмавання мы робім, больш эфектыўнай, што азначае больш задавальнення.

Якія кіруючыя прынцыпы ў дызайне?

Праграмаванне сёння ўключае ў сябе занадта шмат бухгалтарскіх, паўтарэнне і справаводства. Як Дзік Габрыэль кажа, "старыя праграмы чытаць, як ціхія размовы паміж добра кажа навуковы супрацоўнік і добра вывучаных механічных калега, а не як дэбаты з кампілятарам. Хто б мог здагадацца складанасці купіў такі шум? "Выдасканаленасці варта-ніхто не хоча вярнуцца да старых мовах, але гэта можа быць дасягнута больш спакойна?

Перайсці спробы паменшыць аб'ём уводу ў абодвух сэнсах гэтага слова. На працягу ўсёй сваёй канструкцыі, мы стараліся, каб пазбегнуць блытаніны і складанасці. Ёсць не наперад заяў і не файлы загалоўкаў, усё аб'яўлена роўна адзін раз. Ініцыялізацыя з'яўляецца выразнай, аўтаматычны, і просты ў выкарыстанні. Сінтаксіс з'яўляецца чыстым і святло на ключавыя словы. Заіканне (MYFOO foo.Foo * = новы (foo.Foo)) зводзіцца да простай выснову тыпу выкарыстання: = аб'явіць і ініцыялізаваць пабудаваць. І, магчыма, найбольш радыкальна, няма іерархіі тыпаў: тыпы проста, яны не павінны аб'явіць аб сваіх адносінах. Гэтыя спрашчэння дазваляюць пайсці, каб быць выразнай яшчэ зразумелыя без шкоды, а, вытанчанасць.

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

Выкарыстаньне [Уверх]

Хто павінен выкарыстоўваць мову?

Перайсці з'яўляецца эксперымент. Мы спадзяемся, авантурныя карыстачы паспрабаваць і паглядзець, калі ім гэта падабаецца. Не кожны праграміст, але мы спадзяемся, досыць будзе знайсці задавальненне ў падыходзе ён прапануе, каб апраўдаць далейшае развіццё.

З'яўляецца Ці Google выкарыстаннем Перайсці ўнутрана?

Так. Ёсць зараз некалькі праграм Go разгорнутыя ў вытворчасць унутры Google. Напрыклад, сервер за http://golang.org гэта праграма Go, на самой справе гэта проста godoc дакумента сервера працуе ў вытворчасць канфігурацыі.

Ёсць два Перайсці рэалізацыі кампілятара, 6G і сябрамі, увогуле называецца GC, і gccgo. Gc выкарыстоўвае розныя пагаднення аб выкліку і кампаноўнік і таму могуць быць звязаныя з праграмамі З дапамогай той жа Канвенцыі. Існуе такое кампілятар C, але не C + + кампілятар. Gccgo з'яўляецца пярэдняй GCC-канца, што можна, з асцярогай, быць звязаны з GCC-кампіляцыі C ці C + + праграм.

CGO праграма прадугледжвае механізм "Інтэрфейс знешніх функцый", каб дазволіць бяспечна выкліку бібліятэк C з кода Go. SWIG пашырае гэтую магчымасць у C + + бібліятэк.

Перайсці Ці падтрымка буфера Google у пратакол?

Асобны праект з адкрытым кодам забяспечвае неабходны плягін кампілятар і бібліятэкі. Яна даступная на http://code.google.com/p/goprotobuf/

Ці магу я перавесці старонку Ідзі дадому на іншую мову?

Абсалютна. Мы заклікаем распрацоўшчыкаў, каб зрабіць Go Мова сайты на сваіх мовах. Аднак, калі вы вырашылі дадаць Google лагатыпа ці брэндынг на ваш сайт (ён не з'яўляецца на golang.org ), то вам трэба выконваць кіруючыя прынцыпы на http://www.google.com/permissions/guidelines.html

Дызайн [Уверх]

Што здарылася з ідэнтыфікатарамі Unicode?

Гэта было важна для нас, каб пашырыць прастору ідэнтыфікатараў ад межаў ASCII. правілы Го-ідэнтыфікатар сімвалы павінны быць літары ці лічбы, як гэта вызначана Unicode-просты для разумення і рэалізацыі, але мае абмежаванні. Спалучэнне знакаў выключаныя дызайн, напрыклад. Пакуль не будзе ўзгодненай знешняй вызначэнне таго, што ідэнтыфікатар можа быць, плюс вызначэнне кананізацыі ідэнтыфікатараў, што гарантый няма ніякай двухсэнсоўнасці, здавалася, лепш трымаць спалучэння сімвалаў з сумесі. Такім чынам, простае правіла, якое можа быць пашырана пазней, не перарываць працу праграмы, якая дазваляе пазбегнуць памылак, якія, несумненна, узнікаюць з правіла, якое дапускае неадназначнае ідэнтыфікатараў.

На адпаведную запіску, так як экспартаваць ідэнтыфікатар павінен пачынацца з літары верхняга рэгістра, ідэнтыфікатары ствараюцца з "літар" ў некаторых мовах могуць, па азначэнні, не на экспарт. Пакуль адзіным рашэннем з'яўляецца выкарыстанне нешта накшталт X 日本语, што відавочна нездавальняючым, мы разглядаем і іншыя варыянты. Выпадку ў абмен на бачнасць правілы наўрад ці зменіцца аднак, гэта адзін з нашых любімых асаблівасцяў Go.

Чаму не хадзіце ёсць функцыя X?

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

Калі гэта турбуе вас, што Go адсутнічае функцыя X, калі ласка, прабач нас, і даследаваць асаблівасці, якія выходзяць сапраўды ёсць. Вы можаце выявіць, што яны кампенсуюць цікавым чынам з-за адсутнасці X.

Чаму не хадзіце маюць універсальных тыпаў?

Абагульнення можа быць дададзены ў некаторай пункце. Мы не лічым, актуальнасць для іх, хоць мы разумеем, некаторыя праграмісты робяць.

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

Гэта застаецца адкрытым пытаннем.

Чаму не хадзіце ёсць выключэння?

Мы лічым, што сувязі выключэння з структуры кіравання, як і ў Try-Catch-нарэшце, мовай, прыводзіць да заблытаным кодам. Ён таксама мае тэндэнцыю заахвочваць праграмістаў этыкетцы занадта шмат простых памылак, такіх як не адкрыць файл, як выключэння.

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

Глядзіце адкладаць панікі, і аднаўленне артыкуле падрабязна.

Чаму не хадзіце ёсць зацвярджэння?

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

Тыя ж меркаванні ставяцца да выкарыстання сцвярджаць () у тэставых праграм. Правільная апрацоўка памылак азначае вызваліцца іншыя тэсты пабегла за адным не атрымалася, бо што чалавек адладкі адмовы атрымлівае поўную карціну таго, што гэта няправільна. Гэта больш карысна для выпрабаванняў паведаміць, што isPrime дае няправільны адказ на 2, 3, 5 і 7 (або на 2, 4, 8 і 16), чым паведаміць, што isPrime дае няправільны адказ на 2 і, такім чынам, не дадатковыя тэсты праводзіліся. Праграміст, які выклікае памылкі тэсту не могуць быць знаёмыя з кодам, які не ўдаецца. Час інвеставаць Даць добрыя паведамленне пра памылку зараз разлічваецца пазней, калі выпрабаванне перапынкаў.

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

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

Навошта будаваць паралелізму на ідэях СПС?

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

Адзін з самых паспяховых мадэляў за забеспячэнне высокага ўзроўню моўнай падтрымкі паралелізму паходзіць ад Хору ўзаемадзейнічаюць паслядоўныя працэсы, або СПС. Оккама і Erlang два добра вядомых моў, якія вынікаюць з СКП. прымітываў Go's паралелізму выцякаюць з іншай частцы радаводу, асноўны ўклад магутны паняцце каналаў першага класа аб'ектаў.

Чаму goroutines замест тэмы?

Goroutines з'яўляюцца часткай рашэння паралелізму простая ў выкарыстанні. Ідэя, якая была вакол на працягу некаторага часу, з'яўляецца для мультыплексавання самастойна выконвае функцыі-сопрограммы, сапраўды, на мноства патокаў. Калі сопрограмма блокаў, такіх, як шляхам выкліку блакіроўкі сістэмы выкліку, падчас выканання аўтаматычна перамяшчаецца іншых сопрограммы у тым жа патоку аперацыйнай сістэмы на іншую, запускаецца паток, каб яны не будзе заблакіравана. Праграміст бачыць усё гэта, што кропка. Вынік, які мы называем goroutines, можа быць вельмі танна: калі яны марнуюць шмат часу на доўгія сістэмныя выклікі, яны каштуюць крыху больш, чым памяці для стэка.

Каб стэкі мала, Go's падчас выканання выкарыстоўвае сегментаваць стэкаў. Новаспечаныя goroutine даецца некалькі кілабайт, што амаль заўсёды бывае дастаткова. Калі гэта не так, падчас выканання вылучае (і вызваляе) пашырэнне сегментаў аўтаматычна. Накладныя выдаткі ў сярэднім каля тры танныя інструкцый за выклікам функцыі. Мэтазгодна стварыць сотні тысяч goroutines ў адным адраснай прасторы. Калі goroutines былі толькі тэмы, сістэмныя рэсурсы скончацца значна меншае лік.

Чаму карта аперацыі не называецца атамным?

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

Мова не выключае атамнай абнаўлення карты. Пры неабходнасці, напрыклад, калі хостынг ненадзейныя праграмы, рэалізацыя можа блакіроўкі карты доступу.

Тыпы [Уверх]

Актыў аб'ектна-арыентаваная мова?

Так, і няма. Хоць Go мае віды і метады і дазваляе аб'ектна-арыентаваны стыль праграмавання, няма іерархіі тыпаў. Канцэпцыя "інтэрфейсу" ў Go дае іншы падыход, што мы лічым, простая ў выкарыстанні і ў некаторай ступені больш агульным. Існуюць таксама спосабы ўбудавання тыпаў у іншыя тыпы даць што-то аналагічнае, але не ідэнтычныя да падкласаў. Акрамя таго, метады Перайсці больш агульныя, чым у C + + або Java: яны могуць быць вызначаны для любога віду дадзеных, а не толькі структуры.

Акрамя таго, адсутнасць іерархіі тыпаў робіць "аб'ектаў" ў Go адчуваю сябе нашмат больш лёгкі, чым у такіх мовах, як C + + або Java.

Як я магу атрымаць дынамічнай дыспетчарызацыі метадаў?

Адзіны спосаб мець дынамічна накіраваў метадаў праз інтэрфейс. Метады структур ці іншых тыпаў заўсёды вырашаюцца статычна.

Чаму няма тып спадчыну?

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

Замест таго, якія патрабуюць праграміст аб'явіць загадзя, што два тыпу звязаныя, у Перайсці тыпу аўтаматычна задавальняе любы інтэрфейс, які вызначае падмноства яго метады. Апроч зніжэння бухгалтарскага ўліку, гэты падыход мае рэальныя перавагі. Тыпы могуць задаволіць мноства інтэрфейсаў адразу, без складанасцяў традыцыйных множнае спадкаваньне. Інтэрфейсы могуць быць вельмі лёгкі, з адной ці нават нулявой метады ў інтэрфейсе можна выказаць карысныя ідэі. Інтэрфейсы могуць быць дададзены пасля самай справе, калі новая ідэя прыходзіць разам або для тэставання, без аннотирования арыгінальных тыпаў. Таму што Ёсць няма відавочнага адносіны паміж тыпамі і інтэрфейсы, няма іерархіі тыпаў для кіравання або абмеркаваць.

Можна выкарыстоўваць гэтыя ідэі пабудаваць нешта аналагічнае типизированный Unix труб. Напрыклад, убачыць, як fmt.Fprintf дазваляе адфарматаваць друку на любы выхад, а не толькі файл, ці як bufio пакет можа быць цалкам аддзеленая ад файлавага ўводу-вываду, або як крыпта пакеты разам блокаў і струменевае шыфраў. Усе гэтыя ідэі выцякаюць з адзінага інтэрфейсу (io.Writer), які прадстаўляе адзін метад (запіс). І гэта толькі драпіны на паверхні.

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

Чаму Лена функцыі, а не метад?

Мы абмяркоўвалі гэтае пытанне, але вырашылі рэалізацыі Лён і сяброў як функцыі было добра на практыцы і не ўскладняць пытанні аб інтэрфейсе (у сэнсе тыпу Go) асноўных тыпаў.

Чаму Go не падтрымлівае перагрузку метадаў і аператараў?

Метад адпраўкі спрашчаецца, калі гэта не трэба рабіць выгляд адпаведнасці, а таксама. Вопыт працы з іншымі мовамі сказаў нам, што, розныя метады з аднолькавымі імёнамі, але рознымі подпісамі было часам карысна, але што яна можа таксама прывесці да блытаніны і далікатнай на практыцы. Адпаведнасць толькі па імя і патрабуюць адпаведнасць паміж рознымі тыпамі быў асноўным спрашчэння рашэнні ў сістэме тыпу Go's.

Што тычыцца перагрузкі аператараў, здаецца, больш зручнасці, чым абсалютная патрабаванне. Зноў жа, рэчы прасцей без яго.

Чаму не пайсці, "рэалізуе" заявы?

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

Глядзіце пытанне аб спадчыну тыпаў больш падрабязна.

Як я магу гарантаваць мой тып задавальняе інтэрфейс?

Вы можаце папрасіць кампілятар, каб праверыць, што тып T рэалізуе інтэрфейс я, спрабуючы заданне:

 тыпу Т структуры {var} _ I = Т {} 

Калі T не рэалізуе Я, памылка будзе злоўлены падчас кампіляцыі.

Калі вы хочаце карыстальнікам інтэрфейс для заяўляем, што яны яе рэалізацыі, то Вы можаце дадаць метад назва для метаду, інтэрфейсу. Напрыклад:

 Тып інтэрфейсу Fooer {Foo () ImplementsFooer ()} 

Тып павінен затым рэалізаваць метад ImplementsFooer быць Fooer, выразна дакументаванне факту і аб'яўляе яго ў godoc выхад "S.

type Bar struct{}  
func (b Bar) ImplementsFooer() {}  
func (b Bar) Foo() {}  

Большасць код не выкарыстоўваць такія абмежаванні, паколькі яны абмяжоўваюць карыснасць інтэрфейс ідэя. Часам, зрэшты, яны неабходныя для дазволу невыразных сярод падобных інтэрфейсаў.

Значэнні [Уверх]

Чаму не хадзіце забяспечыць няяўных лікавых пераўтварэнняў?

Выгода аўтаматычнага пераўтварэння лікавых тыпаў у З перавешваюць блытаніны прычын. Калі выраз без знака? Наколькі вялікая каштоўнасць? Ці ёсць перапаўненне? З'яўляецца вынікам партатыўныя, незалежна ад машыны, на якой ён выконвае? Гэта таксама ўскладняе кампілятар; "звычайныя арыфметычныя пераўтварэнні" не просты ў рэалізацыі і несумяшчальныя паміж архітэктуры. З меркаванняў пераноснасці, мы вырашылі ўнесці выразнасць і простая ў кошт некаторых відавочных пераўтварэнняў у кодзе. Вызначэнне канстант у Го-адвольнай дакладнасці значэння вольнага ад знакавыя і памер анатацыі-паляпшае пытанняў значна, аднак.

Звязаных падрабязна, што, у адрозненне ад З, Int і int64 розныя тыпы нават калі Int з'яўляецца 64-бітны тып. Int тыпу з'яўляецца агульным, калі вы турбуецеся аб тым, колькі біт цэлае месца, Go заклікае вас быць відавочнымі.

Чаму карты пабудаваны ў?

Ж радкоў прычыне: яны такія магутныя і важныя структуры дадзеных, што прадастаўленне адзін выдатны рэалізацыі з сінтаксічная падтрымкі робіць праграмаванне больш прыемным. Мы лічым, што рэалізацыя Go's карт досыць моцная, што яна будзе служыць для пераважнай большасці ўжыванняў. Калі канкрэтнага прыкладання могуць атрымаць выгаду з карыстацкай рэалізацыі, то, магчыма, каб напісаць адну, але яна не будзе гэтак жа зручным сінтаксічна, гэта здаецца разумным кампрамісам.

Чаму не карты дазваляюць структуры і масівы ў якасці ключоў?

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

Чаму карты, лустачкамі, і каналы высылкі ў той час як масівы значэньняў?

Там вельмі шмат гісторыі на гэтую тэму. Раней, карты і каналы былі сінтаксічна паказальнікі і немагчыма было аб'явіць або выкарыстоўваць не паказальнік экзэмпляра. Акрамя таго, мы змагаліся з тым, як масівы павінны працаваць. У рэшце рэшт мы вырашылі, што строгае падзел паказальнікаў і значэнняў зрабіў мова складаней ў выкарыстанні. Прадстаўляючы спасылкавых тыпаў, у тым ліку фрагменты для апрацоўкі спасылкай выглядзе масіваў, вырашыць гэтыя пытанні. Спасылачныя тыпы дадаць шкадаванне складанасць мовы, але яны маюць вялікі ўплыў на юзабіліці: Go стаў больш прадуктыўным, зручны мову, калі яны былі ўведзеныя.

Напісанне кода [Уверх]

Як бібліятэкі дакументальна?

Існуе праграма, godoc, напісаны ў Go, які здабывае пакет дакументацыі з зыходнага кода. Яго можна выкарыстоўваць у камандным радку ці ў Інтэрнэце. Напрыклад працуе на http://golang.org/pkg/ . На самай справе, godoc рэалізуе поўны сайт http://golang.org/ .

Ёсць стылі Go кіраўніцтва па праграмаванні?

У рэшце рэшт, можа быць невялікі лік правілы, якія рэгулююць такія рэчы, як назвы, знешняга выгляду і арганізацыі файлаў. Дакумент Эфектыўнае Перайсці змяшчае некаторыя парады стыль. Больш непасрэдна, праграмы gofmt з'яўляецца прыгожай друку ", мэтай якога з'яўляецца захаванне правілаў макета, ён замяняе звычайны зборнік рабіць, а чаго нельга, што дазваляе інтэрпрэтацыі. Усе кода Перайсці ў сховішча была праходзіць праз gofmt.

Як я магу ўявіць патчы Перайсці бібліятэкі?

Бібліятэка крыніц у Go / SRC / уп. Калі вы хочаце зрабіць значныя змены, калі ласка, абмяркуйце на спіс рассылкі, перш чым прыступаць.

Глядзіце дакумент Уклад у праект Go для атрымання дадатковай інфармацыі аб тым, як дзейнічаць.

Паказальнікі і размеркаванне [Уверх]

Калі параметры функцый перадаюцца па значэнні?

Усё ў Go перадаецца па значэнні. Функцыя заўсёды атрымлівае копію рэч перадаецца, як калі б аператар прысвойвання прысваення значэнні параметру. Напрыклад, капіраванне значэнне паказальніка робіць копію паказальніка, а не дадзеныя, якія ён паказвае.

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

Я павінен вызначыць метады значэння або паказальнікі?

 функцый (S * MyStruct) зотеМеЫюй () {} / / метад паказальнік функцыі (S MyStruct) зотеМеЫюй () {} / / метад па значэнні 

Пры вызначэнні метаду тыпу прымача (S у прыкладзе вышэй) вядзе сябе дакладна так, калі б аргумент метаду. Вызначыць метад паказальнік тыпу, калі вам трэба змяніць метад дадзеныя прымача вызначае. У адваротным выпадку, ён часта чыстых вызначыць метад тыпу значэння.

У чым розніца паміж новымі і зрабіць?

Карацей кажучы, новая памяць вылучае, ініцыялізуе зрабіць зрэз, карта, і тыпу каналаў.

Глядзіце адпаведны раздзел Эфектыўнае Go для больш падрабязнай інфармацыі.

Чаму Int 32 біт на 64 машын крыху?

Памеры Int і UINT з'яўляюцца ажыццяўленне канкрэтных, але так жа, як адзін з адным на гэтай платформе. 64-бітныя кампілятары Go (як 6G і gccgo) выкарыстоўваць 32-бітныя прадстаўленні для Int. Кодэкса, якая абапіраецца на пэўны памер кошту варта выкарыстоўваць відавочна памеру тыпу, як Int64. З іншага боку, з якая плавае кропкай скаляр і комплексных лікаў заўсёды памеру: float32, complex64 і г.д., таму што праграмісты павінны ведаць аб дакладнасці пры выкарыстанні лікаў з плаваючай кропкай. Па змаўчанні памер плавае кропкай канстанта float64.

Як даведацца, ці з'яўляецца пераменная ў кучы або ў стэку?

З пункту гледжання правільнасці, вам не трэба ведаць. Кожная пераменная ў Go існуе да тых часоў, як Ёсць спасылкі на яго. Месца захоўвання абранай рэалізацыі не мае дачынення да семантыцы мовы.

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

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

Паралелізм [Уверх]

Якія аперацыі атамных? Што пра мьютексы?

Мы яшчэ не цалкам вызначаны ўсе яшчэ няма, але некаторыя падрабязнасці аб атамарнага наяўныя ў памяці спецыфікацыі мадэлі Go .

Што тычыцца мьютексы, сінхранізаваць пакет рэалізуе іх, але мы спадзяемся Перайсці стыль праграмавання будзе заахвочваць людзей, каб паспрабаваць больш высокага ўзроўню тэхнікі. У прыватнасці, разгледзім структуравання праграмы так, што толькі адзін goroutine у ​​той час, калі-небудзь адказнасць за пэўнай часткі дадзеных.

Не мець зносіны шляхам абмену памяці. Замест гэтага, доля памяці зносін.

Паказаць агульную памяць, размаўляючы хады кода і яго звязаныя артыкулы для падрабязнага абмеркавання гэтай канцэпцыі.

Чаму не мульты-goroutine праграмы выкарыстання некалькіх працэсараў?

У GC кампілятараў вы павінны ўсталяваць GOMAXPROCS, каб падчас выканання падтрымкі выкарыстоўваць больш адной аперацыйнай сістэмы струмень. Пад gccgo паток аперацыйнай сістэмы будзе створаны для кожнага goroutine, і GOMAXPROCS фактычна складае колькасць запушчаных goroutines.

Праграмы, якія выконваюць вылічэнні адначасова павінны атрымліваць выгаду ад павелічэння GOMAXPROCS. (Гл. пакета дакументацыі выканання .)

Чаму выкарыстаннем GOMAXPROCS> 1 часам робяць маю праграму памалу?

(Гэта характэрныя для GC кампілятараў. Глядзіце вышэй.)

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

goroutine планавальнік Go's не так добра, як яна павінна быць. У будучыні, яна павінна прызнаць такіх выпадках і аптымізацыі выкарыстання яго патокаў АС. Пакуль GOMAXPROCS павінны быць устаноўлены на аснове кожнага прыкладання.

Функцыі і метады [Уверх]

Чаму T і T * маюць розныя наборы метад?

З Перайсці Spec :

Метад набору любога іншага імя T тыпу складаецца з усіх метадаў з пераемнікам тыпу T. метаду, які адпавядае паказальніка T * Тып мноства ўсіх метадаў з пераемнікам * T ці T (гэта значыць, ён таксама ўтрымлівае метад набору Т).

Калі інтэрфейс значэнне змяшчае паказальнік T *, выклік метаду можна атрымаць значэння шляхам разнаймення паказальніка, але калі інтэрфейс значэнне змяшчае значэнне T, няма карысны спосаб для выкліку метаду для атрымання паказальніка.

Калі б не гэта абмежаванне, гэты код:

var buf bytes.Buffer
io.Copy(buf, os.Stdin)

б копію стандартнага ўводу ў копію buf , а не ў buf сябе. Гэта амаль ніколі не пажаданае паводзіны.

Чаму я бянтэжыць мой шлях закрыцця вядуць сябе як goroutines?

Некаторая блытаніна можа ўзнікнуць пры выкарыстанні замыканняў з паралелізм. Разгледзім наступную праграму:

func main() {
	done := make(chan bool)

	values := []string{ "a", "b", "c" }
	for _, v := range values {
		go func() {
			fmt.Println(v)
			done <- true
		}()
	}

	// wait for all goroutines to complete before exiting
	for _ = range values {
		<-done 
	}
}

Можна было б памылкова чакаць a, b, c , як выхад. Тое, што вы, напэўна, убачыце замест гэтага c, c, c . Гэта таму, што кожны закрыцця акцый той жа зменнай v . Кожны закрыцця друкуе значэнне v у той час fmt.Println выконваецца, а не значэнне v , калі goroutine быў запушчаны.

Для прывязкі значэння v для кожнага закрыцця, як яны пачалі, можна было б змяніць ўнутраны цыкл наступным чынам:

	for _, v := range values {
		go func(u string) {
			fmt.Println(u)
			done <- true
		}(v)
	}

У гэтым прыкладзе, значэнне V перадаецца ў якасці аргументу для ананімнай функцыі. Гэта значэнне затым даступныя ўнутры функцыі як зменную u.

Кіраванне патокам [Уверх]

Пойдзе не маюць: аператар?

Існуе не патройны форме Go. Вы можаце выкарыстоўваць наступныя каб дасягнуць таго ж выніку:

if expr {
	n = trueVal
} else {
	n = falseVal
}

Пакеты і тэсціраванне [Уверх]

Як стварыць многофайловой пакет?

Пакладзеце ўсе зыходныя файлы пакета ў каталог самі па сабе. Зыходныя файлы могуць спасылацца на элементы з розных файлаў па сваім жаданні, і няма неабходнасці наперад дэкларацыі або файл загалоўка.

Іншыя, чым быць падзелены на некалькі файлаў, пакет будзе кампіляваць і тэставаць як пакет ў адным файле.

Як я магу напісаць Модульны тэст?

Стварыць новы файл, які сканчаецца на _test.go у тым жа каталогу, што крыніцы пакетаў. Унутры гэтага файла, імпарт "тэсціраванне" і напісаць функцыі віду

func TestFoo(t *testing.T) {
    ...
}

Run gotest in that directory. That script finds the Test functions, builds a test binary, and runs it.

See the How to Write Go Code document for more details.

Run gotest in that directory. That script finds the Test functions, builds a test binary, and runs it.

See the How to Write Go Code document for more details.

Implementation[Top]

Які кампілятар тэхналогія выкарыстоўваецца для стварэння кампілятараў?

Gccgo мае C + + інтэрфейсных з рэкурсіўнай аналізатар паходжання звязаныя з стандартнай сервернай часткі Персідскага заліва. Gc напісаны на C выкарыстаннем YACC / зуброў для сінтаксічнага аналізатара. Хоць гэта новая праграма, яна ўпісваецца ў Plan 9 C Compiler Suite ( http://plan9.bell-labs.com/sys/doc/compiler.html ) і выкарыстоўвае варыянт Plan 9 пагрузчык для стварэння выкананых файлаў ELF.

Мы разгледзелі Даць 6g, арыгінальны кампілятар Go, Go ў сябе, але ўпадабала не рабіць гэтага з-за цяжкасцяў загрузку і, асабліва, з адкрытым зыходным кодам размеркавання-you'd неабходнасці кампілятар Да стварыць сераду Go. Gccgo, якія прыйшлі пазней, дае магчымасць разгледзець Даць кампілятар ў Go, якая цалкам можа здарыцца. (Go будзе штраф мову, на якім для рэалізацыі кампілятара; роднай лексічны і сінтаксічны аналізатар ўжо даступныя ў / уп / Go ).

Мы таксама разгледзелі выкарыстанне LLVM для 6G, але мы адчувалі, што быў занадта вялікі і павольны для дасягнення нашых мэтаў дзейнасці.

Як падчас рэалізавана падтрымка?

Зноў з-за загрузку пытанняў, падчас выканання кода ў асноўным у З (з ледзь-ледзь на асэмблеры), хоць Перайсці здольныя рэалізаваць Вашы самыя складаныя яго цяпер. падтрымкі часу выканання Gccgo выкарыстоўвае Glibc. Gc выкарыстоўвае карыстацкую бібліятэку, каб трымаць след пад кантролем, ён складзены з версіі Plan 9 C кампілятар, які падтрымлівае сегментаваць стэкаў для goroutines. Вядуцца працы для забеспячэння той жа кіраванне стэкам у gccgo.

Чаму мая простая праграма такіх вялікіх двайковых?

GC ланцугу прылады (5L, 6L, а 8L) генерыраваць толькі статычна звязаных двайковых файлаў. Усё ідзе ў двайковыя файлы таму ўключаць Перайсці падчас выканання, а таксама інфармацыю тып часу выканання, неабходныя для падтрымкі дынамічных праверак тыпу, адлюстраванне, і нават панікі часу трасіроўкі стэка.

Трывіяльна З "Hello, World" праграма складзена і статычна выкарыстаннем GCC на Linux складае каля 750 Кб. Эквівалентную праграму Go складае каля 1,1 Мб, але, што ўключае ў сябе больш магутную падтрымку падчас выканання. Мы лічым, што з некаторым высілкам памер файлаў Go можа быць зменшана.

Прадукцыйнасць [Уверх]

Чаму Перайсці дрэннай працы па крытэрах X?

Адна з мэтаў дызайну Go з'яўляецца падыход прадукцыйнасць C па супастаўным праграмах, але на некаторых тэстах ён зусім дрэнна, у тым ліку некалькі ў тэст / лаўцы . Павольны залежаць ад бібліятэк, для якіх версіі супастаўнай прадукцыйнасці не даступныя ў Go. Напрыклад, pidigits залежыць ад дакладнасці матэматыцы пакет Multi, і C версіі, у адрозненне ад Go's, выкарыстанне GMP (якая напісана на аптымізаваным асэмблеры). Крытэрыі, якія залежаць ад рэгулярных выразаў (Regex-ДНК, напрыклад), па сутнасці параўнання па часовай Перайсці RegExp пакет для спелай, аптымізаваныя бібліятэкі рэгулярных выразаў, як PCRE.

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

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

Змены ў параўнанні з C [Уверх]

Чаму сінтаксіс настолькі адрозніваецца ад C?

Акрамя дэкларацыі сінтаксіс, адрозненні не з'яўляюцца асноўнымі і вынікаюць з двух жаданняў. Па-першае, сінтаксіс павінен адчуваць святло, не занадта шмат абавязковых ключавыя словы, паўторы, або таямніцы. Па-другое, мова быў распрацаваны, каб можна было лёгка аналізаваць і можа быць разабрана без табліцы знакаў. Гэта робіць яго значна прасцей ствараць сродкі, такія як адладчык, залежнасць аналізатары, аўтаматызаваныя экстрактор дакументацыі, IDE плагіна, і так далей. З і яго нашчадкаў, як вядома, цяжка ў гэтым стаўленні.

Чаму заявы назад?

Яны толькі таму, калі вы прывыклі да С. С, паняцце, што пераменная аб'яўлена як выраз пазначае яго тып, які з'яўляецца добрай ідэяй, але і выраз тыпу граматыкі не змешваць вельмі добра, і вынікі могуць увесці ў зман; разгледзець паказальнікаў на функцыі. Перайсці асноўным аддзяляе словы і тыпу сінтаксісу і, што спрашчае рэчы (з прэфіксам * для паказальнікаў выключэнне, якое пацвярджае правіла). У C, заява

	int* a, b;

заяўляе быць паказальнікам, але не B, у Перайсьці

	var a, b *int;

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

	var a uint64 = 1;
мае той жа эфект, як
	a := uint64(1);

Аналіз таксама спрасціць, якія маюць розныя граматыкі для тыпаў, якія не проста выраз граматыкі; ключавыя словы, такія як func і chan захаваць яснасць.

Глядзіце у Дэкларацыі Go Сінтаксіс артыкулы для больш падрабязнай інфармацыі.

Чаму няма арыфметыкі указальнікаў?

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

Чаму + + і - заявы, а не выразы? І чаму Postfix, не прэфікс?

Без арыфметыку паказальнікаў, выгоды значэння пре-і Postfix прырост аператараў кропель. , Выдаліць іх з выразы іерархіі ў цэлым, сінтаксіс выразы спрашчаецца і брудны пытанні, звязаныя з парадкам ацэнкі + + і - (разгледзець F (I + +) і р [я] = Q [+ + я]) ўхіляюцца, а . Спрашчэнне з'яўляецца значным. Што тычыцца прэфікса Postfix супраць, альбо будзе працаваць нармальна, але постфиксный варыянт з'яўляецца больш традыцыйным, настойвае на прэфікс паўстала з STL, бібліятэкі для мовы, імя якога змяшчае, па іроніі лёсу, Postfix прырост.

Чаму там фігурныя дужкі, але не кропка з коскай? І чаму я не магу паставіць адкрывалую дужку на наступны радок?

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

Некаторыя сцвярджаюць, што Лексер павінны рабіць перадпрагляд дазволіць дужкі, каб жыць на наступны радок. Мы не згодныя. Так як Go код прызначаны для фарматавання аўтаматычна gofmt , некаторыя стыль павінен быць абраны. Гэты стыль можа адрознівацца ад таго, што вы выкарыстоўвалі на З або Java, але ісці гэта новы мова і стыль gofmt так жа добра, як і любы іншы. Што больш важна, значна больш важна-перавагі адзінай праграмна даручана фармат для ўсіх праграм Go значна пераважваюць любыя недахопы ўспрымаюцца асаблівы стыль. Звярніце ўвагу на тое, што стыль Перайсці азначае, што інтэрактыўныя ажыццяўлення Go можна выкарыстоўваць стандартны сінтаксіс адной лініі на час без асаблівых правілаў.

Чаму смецця? Ці не будзе занадта дорага?

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

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

Нарэшце, паралелізм ў бок, збор смецця робіць інтэрфейс прасцей, таму што яны не павінны паказаць, як памяць кіруецца праз іх.

Published (Last edited): Jun 2 , source: http://golang.org/doc/go_faq.html