Wed . 20 Apr 2020

Go (бағдарламалау тілі)

Goang деп жиі аталады Goang - бұл Google-де [13] 2007 жылы Роберт Грисемер, Роб Пайк және Кен Томпсон жасаған [12] бағдарламалау тілі [10]. Бұл - дәстүрлі түрде құрастырылған, статикалық терілген тіл. Алгол және С, қоқыс жинау, құрылымды теру шектеулі, [3] жад қауіпсіздігі және CSP стиліндегі бір уақыттағы бағдарламалау мүмкіндіктері қосылған [14]
Тіл 2009 жылдың қарашасында жарияланды; ол Google-тің кейбір өндіріс жүйелерінде, сонымен қатар басқа фирмаларда қолданылады. Екі негізгі іске асыру бар: Google Go compiler, «gc», ашық көзді бағдарламалық жасақтама ретінде жасалынған және Linux, OS X, Windows, соның ішінде әртүрлі платформаларға бағытталған. түрлі BSD және Unix нұсқалары, сонымен қатар 2015 жылдан бастап мобильді құрылғылар, оның ішінде смартфондар [16] Екінші құрастырушы, gccgo, GCC фронтальды болып табылады [17] [18] «gc» құралдар тізбегі 15-нұсқадан бастап хост болып табылады [19]
Мазмұны
1 Тарих
2 Тілдік дизайн
21 Сын - 22 Синтаксис: 23 Түрі
231 Интерфейс жүйесі
24 Пакеттік жүйе
25 Келісімділік: горуэтиндер мен каналдар
251 Параллель бағдарламалауға жарамдылығы - 252 Нәсілдік жағдайдың қауіпсіздігінің жетіспеушілігі
26 Кері байланыс: 3 Конвенциялар мен код стилі
4 Тілдік құралдар
5 Мысал
51 Сәлем әлем
52 Сәйкестік мысалдары: Go - 7 қабылдауды қолданатын 6 жоба - 8 атау беру туралы дау
9 сонымен қатар қараңыз: 10 ескертулер
11 сілтемелер
12 сыртқы сілтемелер
121 қауымдастықтар мен конференциялар
Тарих - шығу тарихы Google инженерлері Роберт Гриземер, Роб Пике және Кен Томпсон эксперимент ретінде басқа тілдердің жағымды сипаттамаларын сақтай отырып, басқа тілдердің ортақ сын-ескертпелерін шешетін жаңа бағдарламалау тілін ойлап тапты [20]. , Java және C ++ сияқты үлкен жүйелер үшін масштабталатын; өнімді және оқылатын, міндетті кілт сөздері жоқ және [21] «беттегі жарық» динамикалық тілдер сияқты қайталанбайды;
құралдарды қажет етпейді, бірақ оны жақсы қолдайды, Кейінгі сұхбаттарда тілдік дизайнерлердің үшеуі де C ++ тілінің күрделілігіне ортақ ұнамайтындықтарын жаңа тілді жобалаудың негізгі уәжі ретінде көрсетті [22] [23] [24]
10-қадам наурызда шығарылды [25]
Go 17 «тілдің бір ұсақ өзгерісі» [26] мен бір портты macOS 1012 Sierra-ға қосып, сонымен қатар кейбір эксперименттік порттарды, мысалы z жүйелеріндегі Linux / s390x Linux үшін кейбір кітапханалық өзгертулерді қолданады және мысалы Unicode 90 қазір қолданады
Тілдік дизайн
Go қайта жасалған С-дің дәстүріне сәйкес келеді, бірақ қысқартуды, қарапайымдылықты және қауіпсіздікті жақсарту үшін көптеген өзгертулер енгізеді. Төменде Go функциясын анықтайтын ерекшеліктерге қысқаша шолу жасалады: Динамикалық тілдерде жиі кездесетін синтаксис және қоршаған орта: [27]
түріндегі кірістіру арқылы қосымша өзгермелі қысқаша мәлімдеме және инициализация x: = 0 емес var x int = 0;
Жылдам құрастыру уақыты [28]
Қашықтан басқаруды басқару [29] және онлайн пакет құжаттамасы [30]
Белгілі бір мәселелерге ерекше көзқарастар:
Кіріктірілген қарама-қайшылықтың прайменттері: жеңіл салмақты процестерді, каналдар мен процедураларды таңдау - виртуалды мұра орнына интерфейс жүйесі және виртуалды емес орнына ендіру мұрагерлік
Әдетте, сыртқы тәуелділіксіз статикалық байланысқан бастапқы екілік файлдарды шығаратын құрал.
Тіл ерекшелігін бағдарламалаушының басына ұстап тұруға болатындай қарапайым тілек, [31] ішінара ұқсас тілдерге тән ерекшеліктерді алып тастау арқылы.
Сын ism
Go сыншыларының пікірінше: «құрама уақыт генерикасының болмауы кодтардың қайталануына әкеледі, метапрограммалауды статикалық түрде тексеру мүмкін емес [32] [33] және стандартты кітапхана жалпы алгоритмдерді ұсына алмайды [34]
тілдің болмауы мысалы, оператордың шамадан тыс жүктелуі арқылы жүктеме белгілі бір міндеттерді көбірек жасайды [32] [35]
типтік жүйеде қауіпсіздік және / немесе экспрессивтілікке кедергі келтіретін Hindley-Milner типті теру болмауы [36] [37]
кідірістер мен үстеме сілтемелер қоқыс жинау GC қолдануды жадты қолмен басқаратын тілдермен салыстырғанда жүйелерді бағдарламалауда қолдануды шектейді [32] [36]
Тіл дизайнерлері бұл сауда-саттық Го-ның сәттілігі үшін маңызды деп санайды [38] және кейбір шешімдерді түсіндіреді. ұзындық [39], бірақ олар болашақта жалпы бағдарламалаудың қандай да бір түрін қосуға және код өндіруді қолданудың стандарттау тәсілдері сияқты прагматикалық жетілдірулерге ашық болады [40] GC туралы айтатын болсақ, Go қорғаушылары кідірісті уақыттың қысқаруына нұсқайды. нұсқалары [41], мысалы 16, Go 16 g олардың алгоритмі нақты уақыт режимінде емес: Синтаксис - Го синтаксисіне кодтың қысқа және оқылуын сақтауға бағытталған С-дан өзгертулер енгізілген, бағдарламалаушыға i: = 3 немесе s жазуға мүмкіндік беретін біріктірілген декларация / инициализация операторы енгізілген. : = «кейбір сөздер», айнымалылардың түрлерін көрсетпестен; Бұл C-нің int i = 3-ке қайшы келеді; және const char s = «кейбір сөздер»; Нүктелік үтірлер әлі де мәлімдемелерді тоқтатады, бірақ олар жолдың соңында қашан пайда болатынын көрсетпейді. Функциялар бірнеше мәндерді қайтаруы мүмкін және нәтижені қайтару мүмкін, қате жұп - бұл функция өзінің шақырушыға қатені көрсететін әдеттегі тәсіл болып табылады [а] Go қосады Құрылым параметрлерін аты бойынша инициализациялауға, карталар мен кесінділерді инициализациялауға арналған синтаксистер C-циклінің үш тұжырымына балама ретінде, Го ауқымындағы өрнектер массивтерге, кесектерге, жолдарға, карталар мен каналдарға қысқаша итерация жасауға мүмкіндік береді. Түрлері
Go кірістірілген бірнеше түрге ие, оның ішінде сандық байт, int64, float32, т.б, бульдер және таңбалар жолдары Жолдар өзгермейді; кірістірілген операторлар мен кілт сөздер функцияларға емес, салыстыруға және UTF-8 кодтау мен кодтауды қамтамасыз етеді [42] Жазбалардың типтерін құрылымдық кілт сөзімен анықтауға болады
T типі үшін және әр n теріс емес бүтін бүтін емес n, сол жерде - [n] T белгіленетін массив түрі; Әр түрлі ұзындықтағы массивтер әр түрлі болады Динамикалық массивтер «кесектер» ретінде қол жетімді, кейбір типтегі T үшін белгіленетін [] T Бұлар массивті кеңейту үшін жаңа жадтың бөлінуі қажет болған кездегі ұзындығы мен сыйымдылығын көрсетеді. негізгі жад [43] [44] [45]
Көрсеткіштер барлық типтер үшін қол жетімді, ал сілтегіш-T типі T мекенжайын алу және жанама & amp; және C операторларындағыдай, немесе анықтама әдісі арқылы немесе атрибутқа қол жеткізу синтаксисі арқылы жүзеге асады [46] Стандартты кітапханада арнайы қауіптіPointer түрінен басқа, көрсеткіш арифметикасы жоқ
K, V типтері жұбы үшін map [K] V - х-кестелер типі-K типтері-V типтегі мәндерге арналған хэш кестелері тілде құрылған, арнайы синтаксис және кіріктірілген функциялар бар T - T типінің мәндерін жіберуге мүмкіндік беретін арна. параллель Go процестері - интерфейстерді қолдаудан басқа, Го типтік жүйесі номиналды: типтік кілт сөз құрылымның жағдайында бірдей орналасуы бар басқа аталатын түрлерден ерекшеленетін жаңа атаулы типті анықтау үшін қолданыла алады. , бірдей тәртіппен бірдей мүшелер, мысалы, әртүрлі бүтін типтер арасындағы түрлендірулер алдын-ала анықталған және жаңа түрді қосу қосымша түрлендірулерді анықтауы мүмкін, бірақ аталған типтер арасындағы конверсиялар әрдайым айқын түрде қолданылуы керек [47]. def кілт сөзін def үшін пайдалануға болады 32 биттік қол қойылмаған бүтін сандар болып табылатын IPv4 мекенжайлары үшін: ipv4addr uint32 типі: Осы типтегі анықтамамен ipv4addrx uint32 мәнін IP мекен-жайы ретінде түсіндіреді, жай ғана x-ті IPv4addr түрінің айнымалы мәніне тағайындау - бұл type error - Тұрақты өрнектер терілуі немесе «ашылмаған» болуы мүмкін; терілген айнымалыға тағайындалған кезде оларға тип беріледі, егер олар көрсететін мән компиляция уақытын тексеруден өтсе [48]
Функция типтері func кілт сөзімен көрсетіледі; олар нөлдік немесе одан көп параметрлерді қабылдайды және нөлдік немесе одан көп мәндерді қайтарады, олардың барлығы теріледі. Параметр және қайтару мәндері функция түрін анықтайды; осылайша, функционалды түзету, int32 int, қате дегеніміз - жолды және 32 биттік қол қойылған бүтін санды алатын және әдепкі ені мен кірістірілген интерфейс түріндегі қатенің мәнін қайтаратын функциялардың түрі
Кез келген аталған тип онымен байланысты әдіс жиынтығы бар Жоғарыдағы IP мекен-жайы мысалы мекен-жайды адам оқи алатын өкілдікке түрлендіру әдісімен кеңейтілуі мүмкін, viz, // Бұл 255255255255 - нөлдік тарату мекен-жайы ма ipv4addr ZeroBroadcast bool
Номиналды теруге байланысты, бұл әдіс анықтамасы ipv4addr-ге әдісті қосады, бірақ uint32-де емес, әдістері арнайы анықтама мен қоңырау синтаксисіне ие болған кезде, әдістің ерекше түрі жоқ [49]


интерфейс жүйесі. Кластық мұрагерліктің орнын басатын екі қасиет
Біріншісі - ендіруді, оны композицияның автоматтандырылған нысаны ретінде қарастыруға болады [50] немесе делегация [51]: 255
Екінші - бұл интерфейстер, олар жұмыс уақытының полиморфизмін қамтамасыз етеді [52]. : 266 Интерфейстер екінші біреуінде құрылымды терудің шектеулі түрін ұсынады Go интерфейсінің барлық әдістерін қолданатын кез келген типтегі интерфейс сол интерфейске сәйкес келеді Go интерфейстері Smalltalk бағдарламалау тіліндегі протоколдардан кейін жасалған [53] Бірнеше көздер Go интерфейсін сипаттау кезінде үйрек теру терминін қолданған [54] [55] Үйрек теру термині дәл анықталмаған және сондықтан қате болмаса да, әдетте бұл сәйкестік статикалық түрде тексерілмейді дегенді білдіреді, өйткені Go интерфейсіне сәйкестік Go құрастырушысымен статикалық түрде тексеріледі, типті бекітуді қоспағанда, Go авторлары қолдануды жөн көреді. терминдік құрылымдық теру
Интерфейс қажетті әдістер мен олардың түрлерін тізімдеу арқылы түрлердің жиынтығын көрсетеді және қажетті әдістерге ие кез-келген типке қанағаттандырады. Ендіру түрлерінде интерфейстердің орындалуын көрсетудің қажеті жоқ, сондықтан егер Shape, Square Шеңбер келесі түрде анықталады: «импорттық» математика «түріндегі пішін интерфейсі» түрі «квадрат құрылымы» функциясы кв кв алаңы e Area float64
содан кейін шаршы да, шеңбер де бірдей түрде Shape болып табылады және оны Shape типтелген айнымалыға тағайындауға болады [52]: 263–268 Ресми тілде, Go интерфейс жүйесі номиналды теруден гөрі құрылымдық қамтамасыз етеді. Интерфейстер басқа интерфейстерді ендіре алады. ендірілген интерфейсті жүзеге асыратын типтермен және жаңадан анықталған интерфейс қосатын кез-келген әдістермен қанағаттандырылған біріктірілген интерфейс құру әсерімен [52]: 270
Go стандартты кітапханасы интерфейстерді бірнеше жерде генерацияны қамтамасыз ету үшін қолданады, Reader және Writer тұжырымдамаларына негізделген енгізу / шығару жүйесін қосқанда [52]: 282–283
Интерфейс арқылы қоңырау шалу тәсілдерінен басқа, Go интерфейс мәндерін жұмыс уақытының типін тексерумен басқа түрлерге түрлендіруге мүмкіндік береді. мұны орындау үшін типті бекіту бар, [56] бір потенциалды түрді тексереді, ал [57] бірнеше түрді тексереді - бос интерфейс маңызды бұрыш болып табылады, өйткені ол сілтеме жасай алады. Кез-келген нақты типтегі затқа Java немесе C # -тегі Object класына ұқсас, бірақ айырмашылығымен бос интерфейс кез-келген типті қанағаттандырады, оның ішінде Java және C # сияқты int типтері кіреді, Объект айнымалысы бола алады. Анықтамалық типтің даналарын ғана ұстаңыз [28]: 284 бос интерфейсті қолдана отырып, аталатын объектіге қарапайым тәсілдер мен кіріктірілген операторларды шақыра алмайды, бірақ интерфейс мәнін сақтай алады, оны одан да пайдалы түрге ауыстыруға тырысыңыз. типті бекіту немесе түрді ауыстыру немесе оны Go шағылыстырғыш пакетімен тексеріңіз [58] Интерфейс кез-келген мәнге сілтеме жасай алатындықтан, C типіндегі бос сияқты статикалық теру шектеулерінен құтылудың шектеулі әдісі болып табылады, бірақ жұмыс уақытының қосымша тексерулерімен.
Интерфейс мәндері мәліметтер сілтемесі мен екінші көрсеткіш арқылы жұмыс уақытының типі бойынша орындалады [59] Кейбір басқа түрлері сияқты, Go бағдарламасында көрсеткіштер көмегімен іске қосылмаған болса, интерфейс мәндері нөл болып табылады [60]
пакет жүйесі
Go пакеттік жүйесінде әр пакеттің жолы болады, мысалы, «c ompress / bzip2 «немесе» golangorg / x / net / html «және мысалы, bzip2 немесе html. Басқа пакеттердің анықтамаларына сілтемелер әрқашан басқа пакеттің атауымен префикстелуі керек және тек басқа пакеттерден бас әріптермен жазыла алады: ioReader bzip2reader жалпыға қол жетімді емес [61] «Get get» пәрмені GitHub сияқты қашықтағы репозиторийде сақталатын бумаларды шығарып алады, [62], ал әзірлеушілерге githubcom / user_name / мысалы, бастапқы репозиторийге сәйкес базалық жолдың ішінде пакеттерді жасауға кеңес беріледі. стандартты кітапханаға немесе басқа сыртқы кітапханаларға болашақ толықтырулармен атаудың қақтығысу ықтималдығын азайту үшін pack_name [63]
Русттың жүк жүйесіне немесе Node-нің npm жүйесіне ұқсас «Go» үшін пакетті басқарудың тиісті шешімін енгізу туралы ұсыныстар бар [64]
Сәйкестік: goutoutines және каналдар
Go тілі кіріктірілген қондырғылармен, сонымен қатар параллельді бағдарламаларды жазуға арналған кітапханалық қолдаумен сәйкес келеді. Concurrency тек CPU параллелизміне ғана емес, сонымен қатар асинхрондылыққа да: баяулауға мүмкіндік береді. Бағдарлама басқа жұмыс жасағанда, мәліметтер базасы немесе желіні оқу сияқты операциялар оқиғаға негізделген серверлерде жиі кездесетін сияқты [65]. Бастапқы келісу құрылымы - гороутин, жеңіл процестің бір түрі. go кілт сөзі жаңа гороутинде функцияны бастайды Тіл сипаттамасы гороутиндердің қалай орындалуы керектігін көрсетпейді, бірақ ағымдағы енгізулер Go процесінің гороутиндерін Эрлангта орындалған кестеге ұқсас кішігірім операциялық жүйелік жинаққа көбейтеді: Синхронды бақылауды басқарудың классикалық құрылымдарының көпшілігі бар стандартты кітапхана пакеті және т.с.с. қол жетімді болса, [66]: 151–152 идиомалық қатарлас бағдарламалар орнына гороутиндер арасында хабарлама жіберуді қамтамасыз ететін арналарды қалайды [67] Қосымша буферлер дүкені хабарламалар FIFO ретіндегі [51]: 43 және хабарларды алғанға дейін гороутиндерді жіберуге мүмкіндік береді. Каналдар терілген, сондықтан T типіндегі каналды тек беру үшін пайдалануға болады T типті хабарламалар оларға арнайы синтаксис қолданылады; & lt; -ch - бұл ch арнасының үстінен мән түскенге дейін орындалатын горутиннің бұғатталуына әкелетін өрнек, ал ch & lt; - x мәні, мүмкін, басқа горутин мәнін алғанға дейін блоктау x мәнін жібереді. мәлімдеме бірнеше арналарда оқшауланбаған байланысты жүзеге асыру үшін пайдаланылуы мүмкін; мысал үшін төменде қараңыз. Go-да деректерді қауіпсіз бөлісу үшін гороутиндердің арналарды немесе басқа операцияларды қалай қолдану керектігін сипаттайтын жад моделі бар. Арналардың бар болуы хабарландырулар тікелей актерлерге бағытталған Эрланг сияқты актерлік үлгідегі параллельді тілдерден бөлек тұрады. гороутиндерге сәйкес келеді; актерлік стильді гороутиндер мен арналар арасындағы бір-біріне сәйкес келетін корреспонденцияны қолдана отырып Go-да модельдеуге болады, бірақ тіл бірнеше горучиналарға арнаны бөлісуге немесе жалғыз горутинді бірнеше арнаға жіберуге және алуға мүмкіндік береді [66]: 147
Осы құралдардан бір мезгілде жұмысшылар пулын, құбырларды, мысалы, файл жүктеу кезінде ашылатын және талданатын, бір мезгілде өңделетін фондық қоңыраулар, қызметтер жинағына параллель қоңырау шалу және басқалары сияқты бір уақыттағы конструкциялар салуға болады. [68] Сондай-ақ, арналар қарапайым процестер байланысының түсінігінен, мысалы, қайта өңделген буферлердің бір уақыттағы қауіпсіз тізбегі ретінде қызмет етуді, [69] короутиндерді қолданып, goutoutine атауын шабыттандыруға көмектесетін [70] және итераторларды іске асыруда [71] қосымша мүмкіндіктерді тапты.
Go каналдарының конверсиялық құрылымдық шартты белгілері және баламалы канал кірістері Tony Hoare-дің байланысқан дәйекті процестер моделінен алынған, мысалы, Accam немесе Limbo сияқты алдыңғы қатарластырылған бағдарламалау тілдерінен айырмашылығы hich Go бірлескен дизайнері Роб Пайк жұмыс жасады, [72] Go қауіпсіз немесе тексерілетін сәйкестік туралы ешқандай түсінік бермейді [73] Коммуникациялық процестер моделі Go-ді таңдағанымен, бұл жалғыз емес: барлығындағы бағдарлама бір адрестік кеңістікті бөліседі Бұл мутоционалды нысандар мен көрсеткіштерді горутиндер арасында бөлуге болатындығын білдіреді; қараңыз § Жарыс жағдайының қауіпсіздігінің жоқтығы, төменде: Параллель бағдарламалауға жарамдылық ... Го-ның келісу мүмкіндіктері, ең алдымен, параллель өңдеуге бағытталмаған, бірақ оларды ортақ жадыны көп процессорлы машиналарды бағдарламалау үшін пайдалануға болады Әр түрлі зерттеулер жүргізілген Осы тәсілдің тиімділігіне сәйкес жасалған [74] Осы зерттеулердің бірі Google бағдарламасының әзірлеушілерінің Go сарапшысы Go бағдарламасының сарапшысы жасаған және тәжірибесі жоқ бағдарламашы жазған бағдарламалардың жылдамдығы мен код жолдарының көлемін салыстырды. Chapel, Cilk және Intel TBB үшін де бірдей. Зерттеуде сарапшы емес бір алғышартты бөліп-бөліп алгоритмдерді бір рекурсияда бір өту туралы жазумен, ал сарапшы бір процессорға бір горутинді қолдана отырып үлестіру-жұмыс-синхрондау бағдарламаларын жазатындығы анықталды. бағдарламалар әдетте жылдамырақ болды, бірақ одан да ұзақ болды [75]
Нәсілдік жағдай қауіпсіздігінің жоқтығы - Горутиндердің ортақ мәліметтерге қол жетімділігіне, жарыс жағдайларын жасауға мүмкіндік беретін шектеулер жоқ. егер бағдарлама арналармен немесе басқа құралдармен нақты үндестірілмесе, бір горучиналық жазудан ішінара, толығымен немесе мүлде басқасына көрінбеуі мүмкін, көбінесе жазуға тапсырыс берудің кепілдігі жоқ [73]. мәндер, тілімдер тақырыптары, хэш кестелер және жол тақырыптары жарыс жағдайларына әсер етпейді, сондықтан синхрондаусыз осы типтердің ортақ даналарын өзгертетін көп ағынды бағдарламаларда түрі мен жад қауіпсіздігі бұзылуы мүмкін [76] [77]
Тілдің орнына. қолдау, қауіпсіз параллель бағдарламалау осылайша конвенцияларға сүйенеді; мысалы, Chisnall «aliases xor mutable» деп аталатын идиоманы ұсынады, яғни ауыспалы мәнді немесе көрсеткішті арна арқылы өткізу оның меншік құқығын оның алушыға беруін білдіреді [66]: 155
Оценки - Әдейі өтіңіз Басқа тілдерде кездесетін белгілі бір ерекшеліктерді, соның ішінде іске асыруды мұрагерлікке, жалпы бағдарламалауға, бекітулерге, көрсеткіш арифметикасына және анық емес түрлендірулерге жол бермейді. Осы тілдік ерекшеліктердің ішінен Go авторлары жалпы бағдарламалауға, ашық пікірлер мен дәлелдер арифметикасына қарсы нақты пікір білдіруге, Мұра түрін тиімдірек тіл ретінде беру құқығын жоққа шығару таңдауын қорғаған кезде, оның орнына динамикалық диспетчерлік [b] және композицияны кодты қайта пайдалану үшін композицияға қол жеткізу үшін интерфейстердің қолданылуын ынталандыру Құрылым мен өкілдік іс жүзінде құрылымды енгізу арқылы автоматтандырылған; Зерттеушілердің пікірінше, Schmager соавт, бұл қасиет «мұрагерліктің көптеген кемшіліктері бар: ол объектілердің жалпы интерфейсіне әсер етеді, ол ұсақ емес, яғни ендіруді ешқандай деңгей деңгейінде басқаруға болмайды, ендірілген нысандардың әдістерін жасыруға болмайды, және бұл «статикалық», мұны бағдарламашылар басқа тілдердегі бағдарламашыларға мұраны асыра пайдалану үшін атақ берілген дәрежеде шамадан тыс пайдаланбайды ма, жоқ па, оны «анық емес» етеді [50]
Жалпы бағдарламалауға қатысты кейбір кіріктірілген функциялар іс жүзінде болады -жалпы, бірақ бұлар ерекше жағдайлар ретінде қарастырылады; Роб Пике бұл тілдің әлсіздігі деп атайды, ол белгілі бір уақытта өзгеруі мүмкін. [43] Генерикамен бірге тәжірибелік Go диалектісі үшін кем дегенде бір компилятор құрастырған Google командасы оны шығармады [78]
Бастапқыда ерекше жағдайларды алып тастағаннан кейін, тілге ерекше дүрбелең / қалпына келтіру механизмі қосылды, оны Go авторлары қалпына келтірілмейтін қателіктер үшін, мысалы, бүкіл бағдарламаны немесе сервер сұрауын тоқтата алатын немесе қателерді көбейту үшін тіркесім ретінде қолдануға кеңес береді. пакет ішіндегі стек, бірақ пакеттің шекарасынан тыс; Мұнда қателіктер стандартты API болып табылады [79] [80] [81] [82]
Конвенциялар және код стилі
Go авторлары Go бағдарламаларының стилі мен дизайнын қалыптастыруға көп күш жұмсады:
Шегіну. , интервал және кодтың басқа деңгейлік мәліметтері gofmt құралы арқылы автоматты түрде стандартталады, қосымша стильдер автоматты түрде тексеріледі. Go-мен таратылған құралдар мен кітапханалар API құжаттамасының godoc [83], тестілеуден өту, build go build, пакетті басқару керек және т.с.с.
Go басқа тілдерде ұсынылатын ережелерді қолданады, мысалы, циклдік тәуелділіктерге, пайдаланылмайтын айнымалыға немесе импортқа тыйым салу және түрдің түрлендірілуіне тыйым салу
Мысалға кейбір мүмкіндіктердің жіберілмеуі , функционалды-бағдарламалау сілтемелері карта және C ++ стилі - тырысу / ақырында блоктар белгілі бір нақты, нақты және императивті бағдарламалау стилін ынталандырады ... Бір күні Go тобы Go идиомаларының жинағын шығарды, содан кейін r кодын да жинады. Go стилін және кодтау философиясын үйрету үшін пікірлерді, келіссөздерді, ресми блог жазбаларын қарап шығыңыз. Тілдік құралдар
Go көптеген тілдік таратулар сияқты жөндеудің, тестілеудің және кодтарды тексерудің құралдарын қамтиды. , бастапқы файлдарда тек ақпаратты пайдалана отырып Go екілік файлдарын құратын, go make файлдарын, жеке тестілеу үшін, жеке блоктар мен микробендер белгілері үшін емес, go fmt, кодты пішімдеу үшін go go, қашықтықтан бумаларды алу және орнату - go vet, статикалық анализатор, кодтың қателіктерін іздейді, godoc кодын құру және орындау, құжаттаманы көрсету немесе HTTP gorename арқылы қызмет ету үшін сілтеме. айнымалы мәндерді, функцияларды және тағы басқаларды қалай өзгертуге болады? Қауіпсіз түрдегі жолды құру, код генераторларын шақырудың стандартты әдісі
Оған сонымен қатар профильдеу және күйін келтіруді қолдау, мысалы, қоқыс жинауды бақылау үшін жұмыс уақыты құралдары жатады. кідірістер және жарыс жағдайын тексеруші - Экосиз бар стандартты үлестіруге қосатын үшінші тарап құралдарының, мысалы, көптеген мәтіндік редакторларда кодты автотолтыру мүмкіндігін беретін Go командасының мүшелері, қажет болған жағдайда пакеттік импортты автоматты түрде қосатын / алып тастайтын goocode, қате, кодты анықтайтын кодтарды қосады. байқаусызда қателерді елемейді, және кеңінен қолданылатын мәтіндік редакторларға тілдік қолдауды қосу үшін көптеген плагиндер бар және кем дегенде бір IDE, LiteIDE «қарапайым, ашық, ашық платформалы Go IDE» деп аталады [84]
Мысалдар
Сәлем әлем
Go: сәлемдесу әлемі бағдарламасы: «main» импорттық «fmt»
Функцияның негізгі функциясы - Келісімділік мысалы: Төмендегі қарапайым бағдарлама Гоға сәйкес келу мүмкіндіктерін көрсетеді. асинхронды бағдарламаны іске қосу Ол екі «гороутиндер» жеңіл жіптерді іске қосады: біреуі пайдаланушының кейбір мәтінді теруін күтеді, ал екіншісі күту уақытының өтуін жүзеге асырады Таңдау мәлімдемесі осы горутиндердің екеуінің де негізгі жоспарға хабарлама жіберуін күтеді және әрекет етеді мысал келтірілген бірінші хабарлама Chisnall [66]: 152 - «fmt»
«уақыт»
негізгі оқу пакетін импорттау

функционалды оқулықтар тізбегі - функциялар мен күту уақыты chan bool - функционалдық негізгі жобалар Go
пайдалану Бұл бөлім бастапқы көздерге сілтемелерге өте қатты тәуелді. Екінші және үшінші деңгей көздерін қосу арқылы осы бөлімді жетілдіріңіз. Қараша, 2015 ж. Осы шаблондық хабарламаны қалай және қашан жою керектігін біліңіз. Go-дағы кейбір танымал көздер қосымшалары:
Docker, Linux контейнерлерін орналастыруға арналған құралдар жиынтығы - Doozer, басқарылатын хостинг провайдерінің Heroku [14]
geth Ethereum - InfluxDB, дүниежүзілік есептеу платформасы, арнайы ашық дерекқор. Қол жетімділігі мен жоғары өнімділік талаптары бар уақыт қатарларының мәліметтерін өңдеу - Juju, Canonical-тің қызмет көрсету орталығы, Ubuntu Linux
Packer пакеттерінің пакеті, бір көзден конфигурациядан бірнеше платформаларға бірдей машина кескіндерін жасауға арналған құрал
Snappy, Canonical
Syncthi жасаған Ubuntu телефонына арналған пакет менеджері ng, файлдарды ашық үндестіру клиенті / сервер қосымшасы
Go қолданыстағы кейбір танымал бастапқы негіздер:
Beego, Go бағдарламасындағы жоғары өнімді веб-бағдарлама, веб-бағдарламалар мен сервер серверлері үшін пайдаланылады [дәйексөз қажет] > Martini, веб-қосымшаларға / қызметтерге арналған пакет [дәйексөз қажет] - Gorilla, Go үшін веб-құралдар жиынтығы [сілтеме қажет]
Enduro / X ASG, кластерлік орта бағдарламасы, қосымшалар сервері, таратылған транзакция және бірнеше өңдеуге арналған жүйе Go [дәйексөз қажет]
Go функциясын басқа тілдермен бірге қолданатын басқа танымал компаниялар мен сайттар, мыналарды қамтымайды: [85] [өзін-өзі жариялайтын ақпарат көзі] [86]
AeroFS, кейбіреулерін көшірген бұлтты файлдарды синхрондық жабдықтаушы Жадтан іздеудің негізгі жақсартуларымен Java-дан Go-ға дейінгі микросервистер [87]
Бағдарламалық жарнамалық компания Chango нақты уақыт режиміндегі сауда-саттық жүйелерінде Go жүйесін қолданады [88]
Cloud Foundry, платформа [сілтеме қажет] <қызмет ретінде. br> CloudFlare, Railgun прокси-серверін, олардың таратылған DNS қызметі үшін, а SPDY сайттарына криптография, журнал жүргізу, ағындарды өңдеу және кіру құралдары [89] [90]
CoreOS, Linux негізіндегі Docker контейнерлерін қолданатын операциялық жүйе [91]
Couchbase, Querybase және индекстеу қызметтері. Couchbase Server [92]
Dropbox көптеген маңызды компоненттерін Python-дан Go [93] Google-ге көшірді, атап айтқанда dlgooglecom жүктеу серверін қосқанда [94] [95] [96]
MercadoLibre, бірнеше жалпы API үшін [дәйексөз қажет]
MongoDB, MongoDB даналарын басқаруға арналған құралдар [97]
Netflix, олардың серверлік архитектурасының екі бөлігі үшін [98]
Novartis, ішкі түгендеу жүйесіне арналған [дәйексөз] қажет]
Plugdj, әлеуметтік музыканың интерактивті веб-сайты [99]
Кәсіпорын құруға арналған репликаланған, докер негізіндегі PaaS, орнатылатын бағдарламалық қамтамасыз ету [100]
SendGrid, Боулдер, Колорадо негізіндегі транзакциялық электрондық поштаны жеткізу және басқару сервис [101]
Soundcloud, «ондаған жүйелер» үшін [102]
Сплит, бүкіл артқы API үшін және олардың талдаушылары үшін Онлайн музыкалық ынтымақтастық платформасы [103]
CoyIM [104]
Twitchtv, ойлау жұмыстары, Python [105] - Uber-ден қоныс аударған чат жүйесі үшін. Геофенге негізделген сұраныстардың жоғары көлемін өңдеу үшін [106]
Зерода, нақты уақыт режимінде шолу және нарықтық деректерді ағынды ету үшін [дәйексөз қажет]
Қабылдау
Го-ның алғашқы шығарылымы көп талқылауға алып келді
Интерфейс жүйесі, және мұрагерліктің әдейі жіберілмеуін Мишель Симонато мақтады, ол бұл тілдік сипаттамаларды Standard ML-мен салыстырды, мұны «ешбір танымал тіл дизайн кеңістігінде [осы] белгілі бір бағытты ұстанбағаны ұят» деп атады [107] Дэйв Астелс қозғалтқыш алаңында былай деп жазды: [108]
өту өте оңай, фундаменталды тілдік ұғымдардың ең аз саны бар және синтаксис таза және түсінікті етіп жасалынған. Go тәжірибелік және әлі де аз жиектері тегіс емес - Ars Technica intervie Роб Пике, Го авторларының бірі және жаңа тілдің не үшін керек екенін сұрады. Ол былай деп жауап берді: [109]
Тек қолданыстағы бағдарламалау тілдеріне мүмкіндіктер қосу жеткіліксіз, өйткені кейде сіз көп нәрсені таба аласыз заттарды алып тастаудың ұзақ уақыты. Олар нөлден бастағысы келді және бәрін қайта ойластырғысы келді [Бірақ олар қаламады] әзірлеушілер бұрыннан білген нәрседен тым көп ауытқуды қалады, өйткені олар Го-ның мақсатты аудиториясын иеліктен шығармағылары келді
Go бағдарламалау тілі деп аталды TIOBE бағдарламалау қауымдастығының индексі бойынша 2009 жылдың бірінші жылы, қараша айында енгізілгеннен кейін, бар-жоғы 2 ай ішінде танымалдықтың 12 айлық өсуіне ие болды және 2010 жылдың қаңтарында 13-орынға ие болды, [110] Паскаль сияқты белгіленген тілдерден асып түсіп, 2015 жылғы маусымда оның рейтингі индексте 50 орыннан төмендеп, COBOL және Fortran-дан төмен болды [111] Бірақ 2016 жылдың қыркүйегінде [жаңарту] бойынша оның рейтингі 19-ға көтерілді, бұл оны көрсетеді. айтарлықтай өсу Танымалдық пен қабылдау жағдайында [112]
Гоға қатысты Брюс Эккель былай деді: [113]
C ++ күрделілігі жаңа C ++-те одан сайын күрделілікке ие болды және өнімділікке әсер ету енді ақталмайды C ++ тілін қолдану үшін C ++ бағдарламашысының өтуі керек болатын барлық ілмектер енді мағынасы жоқ - олар тек уақыт пен күш-жігерді ысырап етеді, ал C ++ бастапқыда пайда болған мәселелер класы үшін әлдеқайда маңызды. Google инженері 2011 жылы тілді бағалауды және оның gc іске асырылуын C ++ GCC, Java және Scala-мен салыстырғанда шешуге ниетті екенін анықтады:
Go тілдің қызықты мүмкіндіктерін ұсынады, сонымен қатар қысқаша және стандартталған нотаға мүмкіндік береді. Бұл тілге арналған компиляторлар әлі жетілмеген, бұл өнімділік пен екілік өлшемде де көрініс табады - R Hundt [114]
Go Go кодын жетілдірген Go Development тобының қызметкері Иэн Лэнс Тейлор бағаны жоққа шығарды. Хундттың қағазы, ниетін білмеген еді өз кодын жариялау үшін ион және оның нұсқасы «ешқашан идиоматикалық немесе тиімді Go үлгісі болуға арналмаған»; Содан кейін Расс Кокс Go кодын, сонымен қатар C ++ кодын оңтайландырды және Go кодын C ++-ге қарағанда біршама жылдам және жылдамдықтағы қағаздардағы «оңтайландырылған» кодтан гөрі жылдамдыққа көбірек алды [115]
Аталмыш дау
2009 жылдың 10 қарашасында, тілдің жалпы шығарылған күні, Фрэнсис МакКабе, Go әзірлеушісі! бағдарламалау тілі леп белгісіне назар аударып, 10 жыл бойы дамып келе жатқан тілімен шатасуды болдырмау үшін Гуглдің атауын өзгертуді сұрады [116] МакКейб «үлкен жігіттің» оны айналып өтіп кетуі мүмкін »деп алаңдаушылық білдірді. және бұл алаңдаушылық Google-тің ресми шығарылымдарына түсініктеме берген 120-дан астам әзірлеушілердің есімін өзгерту керек деп түсіндірді, ал кейбіреулері [117] бұл мәселе Google-дің ұранына қайшы: «жаман болмаңыздар» [118] деген пікір білдірді. Google әзірлеушісі 2010 жылдың 12 қазанында «Бақытсыз» жеке мәртебесімен жабылған және келесі түсініктемемен: «Go деген көптеген есептеу өнімі мен қызметтері шығарылғаннан кейін 11 ай ішінде екі тілде ең аз шатасулар болды».
Сондай-ақ, ақысыз бағдарламалық жасақтама порталын қараңыз
Dart, UFCS Google-дің басқа Google бағдарламалау тілі, басқа тілдерде «ашық әдістердің» тәсілі
Notes
бағдарламалау тілдерін салыстыру ^ Әдетте, нәтиженің дәл бірі және қате мәндерінің типтің нөлдік мәнінен басқа мәні бар; кейде екеуі де оқиды немесе жазады, ол тек жартылай аяқталған кезде орындалады, ал кейде оқу 0 байтты қайтарған кезде де болмайды. Semipredicate мәселесін қараңыз. Неліктен мұрагерлік типі жоқ «дегенге FAQ тілінде [10]
Сілтемелер
Бұл мақалада Creative Commons Attribution 30 лицензиясы бойынша лицензияланған Go Go ресми оқулығынан алынған материалдар бар. ^» FAQ - Go «Golangorg» бағдарламалау тілі 2013-06-25 жж. «Шығару тарихы - Go бағдарламалау тілі» golangorg 19 қазан 2016 ж. Анықталды
ab «Неліктен Go» бар «мәлімдемелерді» «жүзеге асырады» «golangorg» 1 қазан 2015 ж.
^ Pike, Rob 2014-12-22 «Twitter-де Роб Пайк» Тіркелген 2016-03-13 Go құрылымдық типтелген, үйрекпен терілмеген Толық интерфейстің қанағаттануы тексеріліп, талап етіледі
^ «lang / go: go- 14 – Go programming language" OpenBSD ports 2014-12-23 Retrieved 2015-01-19 
^ "Go Porting Efforts" G o Language Resources cat-v 12 January 2010 Retrieved 18 January 2010 
^ "Text file LICENSE" The Go Programming Language Google Retrieved 5 October 2012 
^ "Additional IP Rights Grant" The Go Programming Language Google Retrieved 5 October 2012 
^ a b Pike, Rob 2014-04-24 "Hello Gophers" Retrieved 2016-03-11 
^ a b c "Language Design FAQ" golangorg 16 January 2010 Retrieved 27 February 2010 
^ "The Evolution of Go" Retrieved 2015-09-26 
^ https://golangorg/LICENSE
^ Kincaid, Jason 10 November 2009 "Google's Go: A New Programming Language That's Python Meets C++" TechCrunch Retrieved 18 January 2010 
^ a b Metz, Cade 5 May 2011 "Google Go boldly goes where no code has gone before" The Register 
^ "Go FAQ: Is Google using Go internally" Retrieved 9 March 2013 
^ "Google's In-House Programming Language Now Runs on Phones" wiredcom 19 August 2015 
^ "FAQ: Implementation" golangorg 16 January 2010 Retrieved 18 January 2010 
^ "Installing GCC: Co nfiguration" Retrieved 3 December 2011 Ada, Go and Objective-C++ are not default languages 
^ "Go 15 Release Notes" Retrieved 28 January 2016 The compiler and runtime are now implemented in Go and assembler, without C 
^ Pike, Rob 28 April 2010 "Another Go at Language Design" Stanford EE Computer Systems Colloquium Stanford University  Video available
^ "Frequently Asked Questions FAQ - The Go Programming Language" golangorg Retrieved 2016-02-26 
^ Andrew Binstock 18 May 2011 "Dr Dobb's: Interview with Ken Thompson" Retrieved 7 February 2014 
^ Pike, Rob 2012 "Less is exponentially more" 
^ Robert Griesemer 2015 "The Evolution of Go" 
^ "Release History" 
^ https://golangorg/doc/go17
^ Pike, Rob "The Go Programming Language" YouTube Retrieved 1 Jul 2011 
^ Rob Pike 10 November 2009 The Go Programming Language flv Tech talk Google Event occurs at 8:53 
^ Download and install packages and dependencies - go - The Go Programming Language; see godocorg for addresses and documentation of some packages
^ "GoDoc" godocorg 
^ Rob Pike, on The Changelog podcast
^ a b c Will Yager, Why Go is not Good
^ Egon Elbre, Summary of Go Generics discussions
^ Fitzpatrick, Brad "Go: 90% Perfect, 100% of the time" Retrieved 28 January 2016 
^ Danny Gratzer, Leaving Go
^ a b Jared Forsyth, Rust vs Go
^ Janos Dobronszki, Everyday Hassles in Go
^ Rob Pike, Less is exponentially more
^ The Go Authors, Frequently Asked Questions FAQ
^ Rob Pike, Generating code
^ Richard Hudson, Go 14+ Garbage Collection GC Plan and Roadmap
^ Rob Pike, Strings, bytes, runes and characters in Go, 23 October 2013
^ a b Pike, Rob 26 September 2013 "Arrays, slices and strings: The mechanics of 'append'" The Go Blog Retrieved 7 March 2015 
^ Andrew Gerrand, Go Slices: usage and internals
^ The Go Authors, Effective Go: Slices
^ The Go authors Selectors - The Go Programming Language Specification and Calls - The Go Programming Language Specification
^ "The Go Programming Language Specification" golangorg 
^ "The Go Programming Language Specification" golangorg 
^ "The Go Programming Language Specification" golangorg 
^ a b Schmager, Frank; Cameron, Nicholas; Noble, James 2010 GoHotDraw: evaluating the Go programming language with design patterns Evaluation and Usability of Programming Languages and Tools ACM 
^ a b Summerfield, Mark 2012 Programming in Go: Creating Applications for the 21st Century Addison-Wesley 
^ a b c d e Balbaert, Ivo 2012 The Way to Go: A Thorough Introduction to the Go Programming Language iUniverse 
^ "The Evolution of Go" talksgolangorg Retrieved 2016-03-13 
^ Diggins, Christopher 2009-11-24 "Duck Typing and the Go Programming Language" Dr Dobb's Retrieved 2016-03-10 
^ Ryer, Mat 2015-12-01 "Duck typing in Go" Retrieved 2016-03-10 
^ "The Go Programming Language Specification" golangorg 
^ "The Go Programming Language Specification" golangorg 
^ reflectValueOfi interface converts an interface to a reflectValue that can be further inspected
^ "Go Data Structures: Interfaces" Retrieved 15 November 2012 
^ "The Go Programming Language Specification" golangorg 
^ "A Tutorial for the Go Programming Language" The Go Programming Language Google Retrieved 10 March 2013 In Go the rule about visibility of information is simple: if a name of a top-level type, function, method, constant or variable, or of a structure field or method is capitalized, users of the package may see it Otherwise, the name and hence the thing being named is visible only inside the package in which it is declared 
^ "go - The Go Programming Language" golangorg 
^ "How to Write Go Code" golangorg The packages from the standard library are given short import paths such as "fmt" and "net/http" For your own packages, you must choose a base path that is unlikely to collide with future additions to the standard library or other external libraries If you keep your code in a source repository somewhere, then you should use the root of that source repository as your base path For instance, if you have a GitHub account at githubcom/user, that should be your base path 
^ "Go Packaging Pr oposal Process" 
^ a b Rob Pike, Concurrency is not Parallelism
^ a b c d e Chisnall, David 2012 The Go Programming Language Phrasebook Addison-Wesley 
^ "Effective Go" golangorg 
^ "Go Concurrency Patterns" golangorg 
^ John Graham-Cumming, Recycling Memory Buffers in Go
^ treego
^ Ewen Cheslack-Postava, Iterators in Go
^ Brian W Kernighan, A Descent Into Limbo
^ a b "The Go Memory Model" Google Retrieved 5 January 2011 
^ Tang, Peiyi 2010 Multi-core parallel programming in Go PDF Proc First International Conference on Advanced Computing and Communications 
^ Nanz, Sebastian; West, Scott; Soares Da Silveira, Kaue Examining the expert gap in parallel programming PDF Euro-Par 2013 CiteSeerX 10113686137 
^ Russ Cox, Off to the Races
^ Rob Pike October 25, 2012 "Go at Google: Language Design in the Service of Software Engineering" Google, Inc  "There is one important caveat: Go is not purely memory safe in the presence of concurrency"
^ "E2E: Erik Meijer and Robert Griesemer – Going Go" Channel 9 Microsoft 7 May 2012 
^ Panic And Recover, Go wiki
^ "Weekly Snapshot History" golangorg 
^ "Proposal for an exception-like mechanism" golang-nuts 25 March 2010 Retrieved 25 March 2010 
^ "Effective Go" golangorg 
^ "Effective Go" golangorg 
^ LiteIDE,
^ Erik Unger, The Case For Go
^ Andrew Gerrand, Four years of Go, The Go Blog
^ Hugues Bruant "AeroFS - A little golang way" AeroFS 
^ "Chango" GitHub 
^ John Graham-Cumming, Go at CloudFlare
^ John Graham-Cumming, What we've been doing with Go
^ "Go at CoreOS" 
^ "Couch base" GitHub 
^ Patrick Lee, Open Sourcing Our Go Libraries, 7 July 2014
^ "dlgooglecom: Powered by Go" golangorg 
^ Matt Welsh, Rewriting a Large Production System in Go
^ David Symonds, High Performance Apps on Google App Engine
^ "Mongo DB" GitHub 
^ "The Netflix Tech Blog: Application data caching using SSDs" 
^ Steven Sacks "Search &amp; Advances" plugdj tech blog 
^ "ReplicatedHQ" GitHub 
^ Tim Jenkins "How to Convince Your Company to Go With Golang" SendGrid's Email Deliverability Blog 
^ Peter Bourgon, Go at SoundCloud
^ "Go at Google I/O and Gopher SummerFest - The Go Blog" golangorg 
^ TWSTRIKE "CoyIM" ThoughtWorks STRIKE team 
^ Rhys Hiltner, Go’s march to low-latency GC, 5 July 2016
^ "How We Built Uber Engineering's Highest Query per Second Service Using Go" Uber Engineering Blog Retrieved 2016-03-02 
^ Simionato, Michele 15 November 2009 "Interfaces vs Inheritance or, watch out for Go!" artima Retrieved 15 November 2009 
^ Astels, Dave 9 November 2009 "Ready, Set, Go!" engineyard Retrieved 9 November 2009 
^ Paul, Ryan 10 November 2009 "Go: new open source programming language from Google" Ars Technica Retrieved 13 November 2009 
^ jt "Google's Go Wins Programming Language Of The Year Award" jaxenter Retrieved 5 December 2012 
^ "TIOBE Programming Community Index for June 2015" TIOBE Software June 2015 Retrieved 5 July 2015 
^ "TIOBE Programming Community Index for September 2016" TIOBE Software September 2016 Retrieved 17 September 2016 
^ Bruce Eckel 27 August 2011 "Calling Go from Python via JSON-RPC" Retrieved 29 August 2011 
^ Hundt, Robert 2011 Loop recognition in C++/Java/Go/Scala PDF Scala Days 
^ Metz, Cade 1 July 2011 "Google Go strikes back with C++ bake-off" The Register 
^ Brownlee, John 13 November 2009 "Google didn't google "Go" before naming their programming language'" 
^ Claburn, Thomas 11 November 2009 "Google 'Go' Name Brings Accusations Of Evil'" InformationWeek Retrieved 18 January 2010 
^ "Issue 9 - go — I have already used the name for MY programming language" Google Code Google Inc Retrieved 12 October 2010 
External links
Wikimedia Commons has media related to Go programming language
Official website
A Tour of Go official
Go Programming Language Resources unofficial
Co mmunity and conferences
Gopher Academy, Gopher Academy is a group of developers working to educate and promote the Go community
Golangprojectscom, lists programming jobs and projects where companies are looking for people that know Go
GopherCon The first Go conference Denver, Colorado, USA April
Gopher Gala The first Go hackathon
GopherConIndia The first Go conference in India Bangalore Feb
GolangUK The first Go conference in UK London
dotGo European conference Paris, France
GolangShow Go audio podcast GolangShow
Golang Argentina Gophers community blog in Argentina
v
e
Programming languages
Comparison
Timeline
History
Assembly
BASIC
C
C++
C#
COBOL
Fortran
Go
Haskell
Java
JavaScript JS
Lisp
Lua
Objective-C
Pascal
Perl
PHP
Python
Ruby
Shell
Smalltalk
Swift
Visual Basic NET VBNET
more
Category
Comparison
Lists
Alphabetical
Categorical
Generational
No n-English-based
v
e
Google
Overview
Alphabet Inc
History
List of mergers and acquisitions
Products
Criticism
Privacy concerns
Censorship
Domains
Easter eggs
Don't be evil
Advertising
AdMob
Adscape
AdSense
AdWords
Analytics
Contributor
Partners
DoubleClick
DoubleClick for Publishers
Wallet
Communication
Allo
Alerts
Apps Script
Duo
Calendar
Contacts
Gmail
history
interface
Google+
Groups
Hangouts
Inbox
Sync
Text-to-Speech
Translate
Transliteration
Voice
Software
Assistant
Chrome
for Android
for iOS
Chrome Web Store
Apps
Extensions
Cloud Print
Earth
Sky
Moon
Mars
Gadgets
Gboard
Goggles
IME
Pinyin
Japanese
Photos
Keep
News &amp; Weather
Now
OpenRefine
Search
Toolbar
Platforms
Account
Android
version history
software development
Android Auto
Android Pay
Android TV
Android Wear
Authenticator
Body
Books
Library Project
Caja
Cardboard
Cast
Chromecast
Chrome OS
Chromebit
Chromebook
Chromebox
Chrome Zone
Cloud Platform
App Engine
BigQuery
BigTable
Compute Engine
Storage
Contact Lens
Custom Search
Dart
Daydream
Earth Engine
Fit
GFS
Glass
Go
G Suite
Classroom
Home
Jamboard
Marketplace
Native Client
Nexus
OnHub
OpenSocial
Pixel
Play
Books
Games
Movies &amp; TV
Music
Newsstand
Public DNS
Wallet
Wifi
Development
tools
AJAX APIs
App Inventor
Closure Tools
Developers
GData
Googlebot
Guava
Guice
GWS
KML
Kythe
MapReduce
Mediabot
Sitemaps
Summer of Code
Web Toolkit
Search Console
Website Optimizer
Swiffy
Publishing
Blogger
Bookmarks
Drive
Docs, Sheets, Slides, Forms
Drawings
My Maps
Fusion Tables
Domains
FeedBurner
Map Maker
Panoramio
Sites
YouTube
YouTube Instant
YouTube Red
Vevo
Zagat
Search
timeline
Appliance
Blog Search
Books
Ngram Viewer
Custom Search
Finance
Flights
Images
Maps
Mars
Moon
Sky
Street View
Coverage
Competition
Privacy concerns
News
Archive
Patents
Public Data
Scholar
Shopping
Usenet
Videos
Algorithms
PageRank
Panda
Penguin
Hummingbird
Features
Web History
Personalized
Real-Time
Instant Sear ch
SafeSearch
Voice Search
Analysis
Insights for Search
Trends
Knowledge Graph
Knowledge Vault
Discontinued
Aardvark
Answers
Browser Sync
Base
Buzz
Checkout
Chrome Frame
Click-to-Call
Cloud Connect
Code Search
Currents
Desktop
Dictionary
Directory
Dodgeball
Fast Flip
Friend Connect
Gears
GOOG-411
Google TV
Jaiku
Knol
Health
iGoogle
Image Labeler
Labs
Latitude
Lively
Mashup Editor
Notebook
Offers
Orkut
Pack
Page Creator
Picasa
Picasa Web Albums
Picnik
PowerMeter
Q &amp; A
Reader
Script Converter
SearchWiki
Sidewiki
Slide
Squared
Talk
Updater
Urchin
Videos
Wave
Web Accelerator
People
Al Gore
Alan Eustace
Alan Mulally
Amit Singhal
Ann Mather
David Drummond
Eric Schmidt
Jeff Dean
John Doerr
John L Hennessy
Krishna Bharat
Matt Cutts
Patrick Pichette
Paul Otellini
Omid Kordestani
Rachel Whetstone
Rajen Sheth
Ram Shriram
Ray Kurzweil
Ruth Porat
Salar Kamangar
Shirley M Tilghman
Sundar Pichai
Susan Wojcicki
Urs Hölzle
Vint Cerf
Founders
Larry Page
Sergey Brin
Other
Art Project
Calico
Current
Chrome Experiments
Code-in
Code Jam
Developer Day
Google Business Groups
Made with Code
Data Liberation
Takeout
Google Developer Expert
Google for Work
Driverless car
Earth Outreach
Fiber
GV
Google China
Google Express
Googlization
Grants
Googleorg
Lunar X Prize
Project Fi
Material Design
Motorola Mobility
WiFi
X
Events
Science Fair
Searchology
I/O
Developer Day
AtGoogleTalks
Code Jam
Highly Open Participation Contest
Code-in
Projects
Ara
Loon
Tango
Sunroof
Real estate
111 Eighth Avenue
Googleplex
Logo
Doodle4Google
Google Doodles
Related
AI Challenge
Bomb
Goojje
Monopoly City Streets
Unity
Category
Portal
v
e
Rob Pike
Operating systems
Plan 9 from Bell Labs
Inferno
Programming languages
Newsqueak
Limbo
Go
Sawzall
Software
acme
Blit
sam
rio

Publications
The Practice of Programming
The Unix Programming Environment
Other
Renée French
Mark V Shaney
UTF-8
v
e
Ken Thompson
Operating systems
Unix
Plan 9 from Bell Labs
Programming languages
B
Bon
Go
Software
Belle
ed
grep
sam
Space Travel
Thompson shell
Other
UTF-8


Go (programming language)

Random Posts

The San Francisco Examiner

The San Francisco Examiner

The San Francisco Examiner is a longtime daily newspaper distributed in and around San Francisco, Ca...
Frederator Films

Frederator Films

Frederator Films is an animation studio founded by Fred Seibert as part of Frederator Studios, with ...
John Hasbrouck Van Vleck

John Hasbrouck Van Vleck

John Hasbrouck Van Vleck March 13, 1899 – October 27, 1980 was an American physicist and mathematici...
Christian Lacroix

Christian Lacroix

Christian Marie Marc Lacroix French pronunciation: ​kʁistjɑ̃ lakʁwa; born 16 May 1951 is a Fren...