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

Барыңыз
Go Logo Blue.svg
ПарадигмаМультипарадигма: қатарлас, функционалды,[1] императивті, объектіге бағытталған[2][3]
ЖобалағанРоберт Гриземер
Роб Пайк
Кен Томпсон
ӘзірлеушіGo Авторлары[4]
Бірінші пайда болды10 қараша, 2009 ж; 11 жыл бұрын (2009-11-10)
Тұрақты шығарылым
1.15.6 / 3 желтоқсан 2020 ж; 5 күн бұрын (2020-12-03)[5]
Пәнді теруҚорытынды, статикалық, күшті, құрылымдық[6][7]
Іске асыру тіліБар, Ассамблея тілі (gc); C ++ (gccgo)
ОЖDragonFly BSD, FreeBSD, Linux, macOS, NetBSD, OpenBSD,[8] Жоспар 9,[9] Solaris, Windows
ЛицензияBSD -стиль[4] + патент грант[10]
Файл атауының кеңейтімдері.go
Веб-сайтголанг.org Мұны Wikidata-да өңдеңіз
Майор іске асыру
gc, gccgo
Әсер еткен
Алеф, APL,[11] BCPL,[11] C, CSP, Лимбо, Модула, Newsqueak, Оберон, оксам, Паскаль,[12] Smalltalk[13]
Әсер етті
Хрусталь, Zig

Барыңыз Бұл статикалық түрде терілген, құрастырылған бағдарламалау тілі бойынша жасалған Google[14] арқылы Роберт Гриземер, Роб Пайк, және Кен Томпсон.[12] Бару синтаксистік ұқсас C, бірақ жад қауіпсіздігі, қоқыс шығару, құрылымдық теру,[6] және CSP -стиль параллельдік.[15] Тілді көбінесе «деп атайды Голанг оның домендік атауы болғандықтан, golang.org, бірақ тиісті аты - Go.[16]

Екі маңызды іске асыру бар:

Үшінші тарап транспиллер GopherJS[22] құрастырады Өту JavaScript үшін алдыңғы веб-әзірлеу.

Тарих

Go әзірленген Google жақсарту үшін 2007 ж бағдарламалау өнімділігі дәуірінде көп ядролы, желілік машиналар және үлкен код негіздері.[23] Дизайнерлер қолданыстағы басқа тілдерге қатысты сын-пікірлерге жүгінгісі келді Google, бірақ олардың пайдалы сипаттамаларын сақтаңыз:[24]

Дизайнерлерді бірінші кезекте олардың ортақ пайдалануы түрткі болды C ++ ұнатпайды.[26][27][28]

Go 2009 жылдың қарашасында жарияланды,[29] және 1.0 нұсқасы 2012 жылдың наурызында шыққан.[30][31] Go Google өндірісінде кеңінен қолданылады[32] және басқа да көптеген ұйымдарда және бастапқы көзі ашық жобаларда.

Гофер талисман

2016 жылдың қараша айында типтік дизайнерлер Go және Go Mono қаріптерін шығарды Чарльз Бигелоу және Крис Холмс арнайы Go жобасында қолдану үшін. Go - бұл гуманистік санс-сериф ұқсайды Люсида Гранде және Go Mono - бұл біркелкі. Қаріптердің әрқайсысы WGL4 таңбалар жиынтығы және үлкен көлемде оқылатындай етіп жасалған х биіктігі және ерекше әріптік формалар. Go және Go Mono екеуі де DIN 1450 стандартына сәйкес, нөлдік, кіші әріппен жазылады л құйрығымен және бас әріппен Мен серифтермен.[33][34]

2018 жылдың сәуірінде түпнұсқа логотип стильдендірілген GO көлбеу құқығымен артқы сызықтармен ауыстырылды. Алайда, Гофер талисман өзгеріссіз қалды.[35]

2018 жылдың тамызында Go негізгі үлес қосушылары жаңа тілдік ерекшеліктерге арналған екі «эскиздік жобаны» жариялады, генериктер және қате өңдеу және Go пайдаланушыларынан олар туралы кері байланыс жіберуін сұрады.[36][37]Жалпы бағдарламалауға қолдаудың жетіспеуі және Go 1.x қателіктерді өңдеудің көптігі айтарлықтай әсер етті сын.

Нұсқа тарихы

Go 1 үйлесімділікке кепілдік береді[38] стандартты кітапхананың тілдік ерекшелігі мен негізгі бөліктері үшін. Ағымдағы Go 1.15 шығарылымына дейінгі барлық нұсқалар[39] осы уәдесін орындады.

Әрбір үлкен Go шығарылымына екі жаңа негізгі шығарылым болғанға дейін қолдау көрсетіледі.[40]

Go нұсқасының тарихы
Негізгі нұсқаБастапқы шығарылым күніТіл өзгереді[41]Басқа өзгерістер
1–1.0.32012-03-28Бастапқы шығарылым
1.1–1.1.22013-05-13
  • Go 1.1-де бүтін санды тұрақты нөлге бөлу заңды бағдарлама болып табылмайды, сондықтан оны құрастыру кезіндегі қателік.
  • Жолдық және руна литералдарының анықтамасы суррогаттың жартысын жарамды Unicode кодтық нүктелер жиынтығынан шығару үшін нақтыланды.
  • Босатылған қайтару талаптарының ережелері. Егер компилятор функция әрдайым функцияның соңына жеткенге дейін қайтып келетіндігін дәлелдей алса, онда соңғы аяқтау операторы алынып тасталуы мүмкін.
  • Тіл жүзеге асыруға мүмкіндік беретіндігін таңдауға мүмкіндік береді int түрі және уинт түрлері 32 немесе 64 бит.
  • 64-биттік архитектураларда үйінділердің максималды мөлшері едәуір ұлғайтылды, бірнеше гигабайттан бірнеше ондаған гигабайтқа дейін.
  • Стандартты құралдар жиынтығына жарыс детекторын қосу.
1.2–1.2.22013-12-01
  • Тіл қазір қауіпсіздік мақсатында нөлдік көрсеткіштердің белгілі бір қолданылуына жұмыс уақытының дүрбелеңін тудыратынына кепілдік беретіндігін анықтайды.
  • Go 1.2 қолданыстағы массивте немесе тілімде кесу операциясын қолданған кезде сыйымдылықты, сондай-ақ ұзындығын анықтау мүмкіндігін қосады. Кесіндіні кесу операциясы бұрыннан жасалған массивтің немесе тілімнің іргелес бөлігін сипаттау арқылы жаңа кесінді жасайды.
  • Жұмыс уақытын жоспарлағышты енді функционалды қоңырауларға шақыруға болады.
  • Go 1.2 конфигурацияланатын шектеуді енгізеді (стандартты 10,000), бір бағдарламада болуы мүмкін ағындардың жалпы санына.
  • Go 1.2-де горутин жасалған кезде стектің минималды мөлшері 4KB-ден 8KB-ге дейін көтерілді.
1.3–1.3.32014-06-18Бұл шығарылымда тілдік өзгерістер жоқ.
  • Go 1.3 жад моделі буферлік арнаны қарапайым семафора ретінде қолдануға болатындығын анықтап алу үшін буферлік арналарға жіберуге және қабылдауға қатысты жаңа ереже қосады, оны алу үшін арнаға жіберуді және босату үшін арнадан қабылдауды қолданады.
  • Go 1.3 горутаин стектерінің орындалуын ескі, «сегменттелген» модельден алыс модельге өзгертті.
  • Біраз уақыттан бері қоқыс жинаушы болды дәл үйіндідегі мәндерді зерттеу кезінде; Go 1.3 шығарылымы стектегі мәндерге балама дәлдік қосады.
  • Кішкентай карталар бойынша қайталаулар енді бірізділікпен жүрмейді. Бұл іске асырудың мінез-құлқын асыра пайдаланушыларға байланысты.
1.4–1.4.32014-12-10
  • Тағайындалмаған диапазон-өрнек
  • Енді gc және gccgo-да әдістерді шақыру кезінде автоматты түрде екі реттік ажыратуға тыйым салынады. Бұл артқа сәйкес келмейтін өзгеріс, бірақ тілдік спецификацияға сәйкес келеді.
  • 1.4-те қоқыс жинаушы жұмыс уақытындағы бағдарламалар стектерін сканерлеп, қандай айнымалылардың белсенді екендігі туралы нақты ақпарат алу үшін жұмыс уақытының көп коды Go-ге аударылды.
  • Ассемблерлер қабылдаған тіл cmd / 5a, cmd / 6a және cmd / 8a бірнеше өзгертулерге ие болды, негізінен типтік ақпаратты жұмыс уақытына жеткізуді жеңілдету үшін.
  • Ішкі пакеттерді қосу.
  • Жаңа қосалқы команда генерациялайды.
1.5–1.5.42015-08-19

Қадағалаудың арқасында элемент түрін тілім әріптерінен шығаруға мүмкіндік беретін ереже карта кілттеріне қолданылмады. Бұл Go 1.5-те түзетілген.

  • Енді компилятор мен жұмыс уақыты Go және ассемблерде орындалады, енді Go-де компилятор және жұмыс уақыты Go-де орындалғандықтан, тарату көзінен компиляциялау үшін Go компиляторы қол жетімді болуы керек. Компилятор қазір өздігінен орналастырылған.
  • Қоқыс жинаушы 1,5-ке қайта жасалды. Коллектордың «әлемді тоқтату» кезеңі әрдайым 10 миллисекундтан төмен болады және әдетте әлдеқайда аз болады.
  • Go 1.5-те горутиндердің жоспарлану реті өзгертілді.
1.6–1.6.42016-02-17Бұл шығарылымда тілдік өзгерістер жоқ.
  • Go коды Go қоқыс жинаушысымен бірге болуы үшін Go көрсеткіштерін С кодымен бөлісу ережелерін анықтайтын cgo-ға үлкен өзгеріс енгізілді.
  • Go талдаушысы қазір жасалынудың орнына қолмен жазылады.
  • The ветеринарға бару команда енді функцияны немесе әдіс мәндерін аргумент ретінде диагностикалайды Printf, мысалы, өтіп бара жатқанда f қайда f () арналған болатын.
1.7–1.7.62016-08-15

Тілдік спецификациядағы мәлімдемелерді тоқтату туралы түсініктеме. Бұл бар әрекетті өзгертпейді.

  • 64 биттік x86 жүйелері үшін келесі нұсқаулар қосылды (қараңыз) SSE ): PCMPESTRI, RORXL, RORXQ, VINSERTI128, VPADDD, VPADDQ, VPALIGNR, VPBLENDD, VPERM2F128, VPERM2I128, VPOR, VPSHUFB, VPSHUFD, VPSLLD, VPSLLDQ, VPSLLQ, VPSRLD, VPSRLDQ, және VPSRLQ .
  • Бұл шығарылымда 64 биттік x86 жүйелері үшін жаңа кодты генерациялаудың түпкі мәні бар SSA.
  • Cgo қолданатын пакеттер енді Fortran бастапқы файлдарын қамтуы мүмкін (C, C ++, Objective C және SWIG-тен басқа), бірақ Go байланыстырушылары C тілінің API интерфейстерін қолдануы керек.
  • Жаңа подкоманда «жүр құрал дист тізім”Барлық қолдау көрсетілетін амалдық жүйені / архитектура жұптарын басып шығарады.
1.8–1.8.72017-02-16

Мәнді бір құрылым түрінен екіншісіне нақты түрлендіру кезінде Go 1.8 жағдайында тегтер еленбейді. Осылайша тек тегтерімен ерекшеленетін екі құрылым бірінен екіншісіне ауысуы мүмкін.

  • 64 биттік x86 жүйелері үшін келесі нұсқаулар қосылды: VBROADCASTSD, БЕРУШІЛЕР, MOVDDUP, MOVSHDUP, MOVSLDUP, VMOVDDUP, VMOVSHDUP, және VMOVSLDUP.
  • Қоқыстарды жинау кідірістері Go 1.7-ге қарағанда едәуір қысқа болуы керек, әдетте 100 микросекундтан төмен және көбінесе 10 микросекундтан төмен. Мәліметтер алу үшін әлемдік стекті қайта сканерлеуді жою туралы құжатты қараңыз.
  • Кейінге қалдырылған функционалдық қоңыраулардың жартысына жуығы қысқарды.
  • Go to C-ге қоңырау шалу ақысы шамамен екі есеге қысқарды.
1.9–1.9.72017-08-24
  • Go қазір бүркеншік аттарды қолдайды.
  • Қозғалмалы нүктелік арифметикада аралық дөңгелектеуді мәжбүрлеңіз.

Go компиляторы енді бірнеше ядролардың артықшылығын пайдалана отырып, бума функцияларын қатар құруды қолдайды.

1.10–1.10.72018-02-16
  • Типтелмеген тұрақтылардың ауысымына қатысты бұрыштық жағдай нақтыланды.
  • Қабылдағыш ретінде кез-келген типтегі өрнектерге мүмкіндік беру үшін синтаксисті босаңсыту үшін әдіс өрнектерінің грамматикасы жаңартылды.

X86 64 биттік порт үшін ассемблер енді 359 жаңа нұсқаулықты қолдайды, соның ішінде толық AVX, AVX2, BMI, BMI2, F16C, FMA3, SSE2, SSE3, SSSE3, SSE4.1 және SSE4.2 кеңейту жиынтықтары. Ассемблер енді жүзеге асырмайды MOVL $0, AX ретінде XORL күтпеген жерден шарт жалауларын тазартпау үшін нұсқаулық.

1.11–1.11.62018-08-24Бұл шығарылымда тілдік өзгерістер жоқ.
  • Go 1.11-ге эксперименттік порт қосылады Веб-жинақтау.
  • Go 1.11 нұсқалар мен бумаларды тарату үшін интеграцияланған қолдауымен GOPATH баламасы болып табылатын «модульдер» деп аталатын жаңа тұжырымдамаға алдын-ала қолдау көрсетеді.
  • Үшін құрастырушы amd64 енді AVX512 нұсқауларын қабылдайды.
  • Go 1.11 Windows XP және Windows Vista жүйелерін қолдайды.[42]
  • 1.11.3 өтіңіз және кейінірек TLS аутентификациясының осалдығын крипто / x509 бумасында түзетіңіз.[43]
1.12.12019-02-25Бұл шығарылымда тілдік өзгерістер жоқ.
  • TLS 1.3-ті қолдау
  • Жақсартылған модульдерді қолдау (Go 1.13 стандартты болуға дайындық кезінде)
  • Қолдау терезелер / қол
  • Жақсартылған macOS және iOS үйлесімділігі
1.13.12019-09-03

Go қазір бірыңғай және модернизацияланған сандық префикстер жиынтығын қолдайды

  • kripto / tls пакетіндегі TLS 1.3-ті қолдау (әдепкі бойынша бас тарту Go 1.14-те жойылады)
  • Қатені орауға қолдау
1.142020-02-25

Интерфейстерді қабаттасқан әдіс жиынтығымен рұқсат етеді[44]

Модулін қолдау жүр команда енді өндірістік пайдалануға дайын[44]

1.152020-08-11Бұл шығарылымда тілдік өзгерістер жоқ.

Дизайн

Go әсер етеді C, бірақ үлкен қарапайымдылық пен қауіпсіздікке баса назар аудару керек. Тіл мыналардан тұрады:

Синтаксис

Go синтаксисіне өзгертулер кіреді C кодты қысқа және оқылымды ұстауға бағытталған. Программалаушыға жазуға мүмкіндік беретін аралас декларация / инициализация операторы енгізілді i: = 3 немесе s: = «Сәлем, әлем!», түрлерін көрсетпей қолданылатын айнымалылар. Бұл C-мен салыстырылады int i = 3; және const char * s = «Сәлем, әлем!»;. Нүктелі үтірлер мәлімдемелерді тоқтатады,[a] бірақ жолдың соңы болған кезде жасырын болады.[b] Әдістер бірнеше мәнді қайтара алады және a мәнін қайтарады нәтиже, қате жұп - бұл әдіс қоңырау шалушының қателігін Go-да көрсететін әдеттегі әдіс.[c] Go құрылымдық параметрлерді атауы бойынша инициализациялау және инициализациялау үшін әріптік синтаксисті қосады карталар және тілімдер. С-ның үш мәлімдемесіне балама ретінде үшін цикл, Go's ауқымы өрнектер массивтер, тілімдер, жолдар, карталар мен арналар бойынша қысқаша қайталауға мүмкіндік береді.[дәйексөз қажет ]

Түрлері

Go-дің сандық түрлерін қосқанда бірнеше кіріктірілген түрлері бар (байт, int64, 32және т.б.), булевтер және таңбалар жолдары (жіп). Жолдар өзгермейді; кіріктірілген операторлар мен кілт сөздер (функциялардан гөрі) біріктіруді, салыстыруды және UTF-8 кодтау / декодтау.[52] Жазба түрлері көмегімен анықтауға болады құрылым кілт сөз.[53]

Әр түрі үшін Т және теріс емес бүтін тұрақты n, бар жиым түрі белгіленді [n]Т; әр түрлі ұзындықтағы массивтер әр түрлі болады. Динамикалық массивтер белгілері бар «тілімдер» түрінде қол жетімді []Т кейбір түрлері үшін Т. Олардың ұзындығы және а сыйымдылығы массивті кеңейту үшін жаңа жадтың қашан бөлінуі керектігін көрсету. Бірнеше тілім негізгі жадымен бөлісуі мүмкін.[54][55][56]

Көрсеткіштер барлық түрлері үшін қол жетімді, ал көрсеткіш -Т түрі белгіленеді *Т. Мекен-жайын қабылдау және & және * операторлары, C-дағы сияқты немесе әдіс шақыру немесе атрибутқа қол жеткізу синтаксисі арқылы жанама түрде орын алады.[57] Көрсеткіш арифметикасы жоқ,[d] арнайы арқылы ғана қауіпсіз емес стандартты кітапханаға енгізіңіз.[58]

Жұп түрлер үшін Қ, V, түрі карта [Қ]V түрі болып табылады хэш кестелер карта түрі -Қ теру пернелеріV құндылықтар. Хэш кестелері тілге арнайы синтаксиспен және кіріктірілген функциялармен кіріктірілген. чан Т Бұл арна типтің мәндерін жіберуге мүмкіндік береді Т арасында бір уақытта өту процестері.[дәйексөз қажет ]

Оның қолдауынан басқа интерфейстер, Go типті жүйесі номиналды: түрі кілт сөзі жаңасын анықтау үшін қолданыла алады атауы, ол бірдей орналасуына ие басқа аталған типтерден ерекшеленеді (жағдайда a құрылым, сол мүшелер сол ретпен). Түрлер арасындағы кейбір түрлендірулер (мысалы, әр түрлі бүтін типтер арасында) алдын-ала анықталған және жаңа типті қосу қосымша түрлендірулерді анықтауы мүмкін, бірақ аталған типтер арасындағы түрлендірулер әрқашан нақты түрде жүргізілуі керек.[59] Мысалы, түрі кілт сөзі түрін анықтау үшін пайдаланылуы мүмкін IPv4 32 биттік белгісіз бүтін сандарға негізделген мекенжайлар:

түрі ipv4addr uint32

Осы типтегі анықтамамен ipv4addr (x) түсіндіреді uint32 мәні х IP мекенжайы ретінде. Жай тағайындау х түрдегі айнымалыға ipv4addr типтік қате.[дәйексөз қажет ]

Тұрақты тіркестер терілген немесе «типтелмеген» болуы мүмкін; терілген айнымалыға тағайындалған кезде оларға тип беріледі, егер олар ұсынатын мән компиляция-уақыт тексерісінен өтсе.[60]

Функция түрлері көрсетілген функциясы кілт сөз; олар нөл немесе одан да көп алады параметрлері және қайту нөл немесе одан да көп мәндер, олардың барлығы терілген. Параметр және қайтарылатын мәндер функция типін анықтайды; осылайша, func (string, int32) (int, қате) а қабылдайтын функциялар түрі жіп және 32-биттік қол қойылған бүтін санды енгізіп, қол қойылған бүтін санды (әдепкі ені) және кіріктірілген интерфейс түрінің мәнін қайтарады қате.[дәйексөз қажет ]

Кез келген аталған типте a бар әдіс онымен байланысты жиынтық. Жоғарыда келтірілген IP-мекен-жай мысалы оның мәні белгілі стандарт екендігін тексеру әдісімен кеңейтілуі мүмкін:

// ZeroBroadcast addr 255.255.255.255 болатындығы туралы хабарлайды.функциясы (адр ipv4addr) ZeroBroadcast() bool {    қайту адр == 0xFFFFFFFF}

Номиналды терудің арқасында бұл әдіс анықтамасы келесіге әдісті қосады ipv4addr, бірақ жоқ uint32. Әдістердің арнайы анықтамасы және синтаксисі болғанымен, нақты әдіс түрі жоқ.[61]

Интерфейс жүйесі

Go екі функцияның орнын басады сыныптық мұрагерлік.[дәйексөз қажет ]

Біріншісі ендіру, оны автоматтандырылған түрі ретінде қарастыруға болады құрамы[62] немесе делегация.[63]:255

Екіншісі оның интерфейстер қамтамасыз етеді жұмыс уақыты полиморфизмі.[64]:266 Интерфейстер типтер класы болып табылады және шектеулі түрін ұсынады құрылымдық теру басқа жағдайда номиналды типтегі Go жүйесінде. Интерфейс түріндегі объект басқа типке де ұқсас, ұқсас C ++ объектілер бір уақытта базалық және туынды класта болады. Go интерфейстері кейіннен жасалған хаттамалар Smalltalk бағдарламалау тілінен.[65] Терминді бірнеше дереккөздер қолданады үйрек теру Go интерфейстерін сипаттаған кезде.[66][67] Үйрек теру термині дәл анықталмаған және сондықтан қате болмаса да, бұл әдетте типтің сәйкестігі статикалық тексерілмегендігін білдіреді. Go интерфейсіне сәйкестігін Go компиляторы статикалық түрде тексеретіндіктен (типті бекітуді қоспағанда), Go авторлары бұл терминді қалайды құрылымдық теру.[68]

Интерфейс түрінің анықтамасында аты мен түрі бойынша қажетті әдістер тізімделеді. І типті интерфейстің барлық қажетті әдістеріне сәйкес келетін функциялары бар кез-келген Т типіндегі объект I типті объект болып табылады. T типінің анықтамасы I типті анықтауы қажет емес (және мүмкін емес), мысалы, егер Пішін, Алаң және шеңбер ретінде анықталады

импорт «математика»түрі Пішін интерфейс {    Аудан() 64}түрі Алаң құрылым { // Ескерту: «іске асырады» декларациясы жоқ    жағы 64}функциясы (шаршы Алаң) Аудан() 64 { қайту шаршы.жағы * шаршы.жағы }түрі Шеңбер құрылым { // Мұнда да декларация «іске асырылмайды»    радиусы 64}функциясы (c Шеңбер) Аудан() 64 { қайту математика.Pi * математика.Пау(c.радиусы, 2) }

содан кейін екеуі де Алаң және а Шеңбер тікелей емес а Пішін және тағайындауға болады Пішін- типтік айнымалы.[64]:263–268 Ресми тілде Go интерфейс жүйесі қамтамасыз етеді құрылымдық гөрі номиналды теру. Интерфейстер интерфейсті іске қосатын типтер мен жаңадан анықталған интерфейс қосатын кез-келген әдістермен қанағаттанатын аралас интерфейс құру әсерімен басқа интерфейстерді енгізе алады.[64]:270

Go стандартты кітапханасы интерфейстерді бірнеше жерде жомарттықты қамтамасыз етеді, оның тұжырымдамаларына негізделген енгізу / шығару жүйесі. Оқырман және Жазушы.[64]:282–283

Интерфейстер арқылы әдістерді шақырудан басқа, Go интерфейс мәндерін басқа типтерге жұмыс уақытын тексеру арқылы түрлендіруге мүмкіндік береді. Бұл үшін тілдік құрылымдар болып табылады типті бекіту,[69] ол бір потенциалды типке қарсы тексереді және түрлендіргіш,[70] ол бірнеше типке қарсы тексереді.[дәйексөз қажет ]

The бос интерфейс интерфейс {} тармағына сілтеме жасай алатындықтан маңызды негізгі жағдай болып табылады кез келген бетон түрі. Бұл ұқсас Нысан сынып Java немесе C # сияқты кез-келген типке, оның ішінде кіріктірілген түрлерге де қанағаттанған int.[64]:284 Бос интерфейсті қолданатын код сілтеме жасалған объектідегі әдістерді (немесе кіріктірілген операторларды) шақыра алмайды, бірақ ол интерфейс {} мәні, оны түрдің бекітуі немесе түрлендіргіш арқылы неғұрлым пайдалы түрге ауыстыруға тырысыңыз немесе Go-мен тексеріңіз шағылыстыру пакет.[71] Себебі интерфейс {} кез-келген мәнге сілтеме жасай алады, бұл статикалық типтеу сияқты шектеулерден құтылудың шектеулі тәсілі жарамсыз * C тілінде, бірақ жұмыс уақытының қосымша тексерулерімен.[дәйексөз қажет ]

The интерфейс {} типі Go кез келген ерікті схемасының құрылымдық деректерін модельдеу үшін пайдаланылуы мүмкін, мысалы JSON немесе ЯМЛ деректер, немесе Терраформ ретінде ұсыну арқылы ресурстар карта [string] интерфейсі {} (бос интерфейске дейінгі жол картасы). Бұл кез-келген типтегі жол кілттерімен және сөздік түрінде берілгендерді рекурсивті түрде сипаттайды.[72]

Интерфейс мәндері деректерге нұсқауыш және жұмыс уақыты түріндегі екінші нұсқағыш арқылы жүзеге асырылады.[73] Go-дегі көрсеткіштерді қолдану арқылы жүзеге асырылатын кейбір басқа түрлері сияқты, интерфейс мәндері де нөл егер инициализацияланбаған болса.[74]

Пакеттік жүйе

Go-дің пакеттік жүйесінде әр буманың жолы болады (мысалы, «compress / bzip2» немесе «golang.org/x/net/html») және аты (мысалы, bzip2 немесе HTML). Басқа пакеттердің анықтамаларына сілтемелер міндетті түрде болуы керек әрқашан басқа буманың атымен жалғануы керек, және тек бас әріппен жазылады басқа пакеттердегі атауларға қол жетімді: io. оқырман жалпыға қол жетімді, бірақ bzip2. оқырман емес.[75] The бару команда қашықтағы репозитарийде сақталған бумаларды ала алады [76] және әзірлеушілерге стандартты кітапханаға немесе басқа сыртқы кітапханаларға болашақ толықтырулармен аттардың соқтығысу ықтималдығын азайту үшін бастапқы репозитарийге сәйкес келетін базалық жолдың ішінде пакеттер жасау ұсынылады (мысалы ,.com.com/user_name/package_name).[77]

Go үшін пакеттің басқару шешімдерін Perl немесе CPAN сияқты CPAN-ға ұқсас енгізу туралы ұсыныстар бар Тот жүк жүйесі немесе Түйін npm жүйесі.[78]

Параллельділік: горутиндер және арналар

Go тілінде жазу үшін кітапханалық қолдау сияқты кіріктірілген қондырғылар бар қатарлас бағдарламалар. Параллельділік тек CPU параллелизміне ғана емес, сонымен қатар қатысты асинхрония Бағдарлама басқа жұмыстарды орындайтын кезде мәліметтер базасы немесе желінің оқылуы сияқты баяу операциялардың орындалуына мүмкіндік беру, бұл оқиғаларға негізделген серверлерде жиі кездеседі.[79]

Негізгі параллельділік құрылымы болып табылады горутин, түрі жеңіл салмақты процесс. Префиксі бар функция шақыруы жүр кілт сөз жаңа горутинде функцияны бастайды. Тілдік спецификацияда горутиндердің қалай іске асырылуы керек екендігі көрсетілмеген, бірақ қазіргі қолданыстар Go процесінің горутиндерін мультиплекстеудің кішірек жиынтығына операциялық жүйенің ағындары, орындалған жоспарлауға ұқсас Эрланг.[80]:10

Классикалық кітаптардың көпшілігі бар стандартты кітапхана пакеті параллельдік бақылау құрылымдар (мутекс құлыптар және т.б.) қол жетімді,[80]:151–152 орнына идиомалық параллельді бағдарламалар ұнайды арналарқамтамасыз етеді хабарламалар жіберу горутиндер арасында.[81] Қосымша буферлер хабарламаларды сақтайды ФИФО тапсырыс[63]:43 және горутиндерге хабарламалар алынғанға дейін оларды жіберуге рұқсат етіңіз.[дәйексөз қажет ]

Арналар типтегі канал болатындай етіп теріледі чан Т тек түрдегі хабарламаларды жіберу үшін пайдалануға болады Т. Олармен жұмыс істеу үшін арнайы синтаксис қолданылады; <-ch - бұл орындалатын горутиннің арнаға мән түскенге дейін блокталуына әкелетін өрнек ш, ал ch <- x мәнді жібереді х (мүмкін, басқа горутин мән алғанға дейін блоктау). Кіріктірілген қосқыш- тәрізді таңдаңыз оператор бірнеше арналарда блоктаусыз байланысты жүзеге асыру үшін қолданыла алады; қараңыз төменде мысал үшін. Go-да горутиндердің деректерді қауіпсіз бөлісу үшін арналарды немесе басқа әрекеттерді қалай қолдану керектігін сипаттайтын жад моделі бар.[82]

Арналардың болуы Go-ны бөлек қояды актер моделі - хабарламалар тікелей актерлерге жіберілетін (горутиндерге сәйкес келетін) Эрланг тәрізді қатар жүретін тілдер. Актерлер стилін Goout-те және арналарда бір-бірімен сәйкестікті сақтау арқылы модельдеуге болады, бірақ бұл тіл бірнеше горутинге арнаны бөлісуге мүмкіндік береді немесе жалғыз горутинге бірнеше арнаға жіберуге және қабылдауға мүмкіндік береді.[80]:147

Бұл құралдардан жұмысшы бассейндері, құбыржолдары (мысалы, файл жүктеліп жатқанда декомпрессияланып, талданады), фондық қоңыраулар, қызметтер жиынтығына параллель қоңыраулар және т.б. .[83] Арналар сонымен қатар қайта өңделген буфердің параллельділігі қауіпсіз тізімі ретінде қызмет ету сияқты әдеттегі процессаралық байланыс түсінігінен басқа жолдарды тапты,[84] іске асыру коруотиндер (бұл атауды шабыттандыруға көмектесті горутин),[85] және жүзеге асыру итераторлар.[86]

Go-дің валютаға қатысты құрылымдық конвенциялары (арналар және балама арналық кірістер) алынған Тони Хоардікі бірізді процестерді байланыстыру модель. Сияқты алдыңғы қатарлас бағдарламалау тілдерінен айырмашылығы Оккам немесе Лимбо (Go-дің дизайнері Роб Пайк жұмыс жасаған тіл),[87] Go қауіпсіз немесе тексерілетін параллельділік туралы ешқандай түсінік бермейді.[88] Қарым-қатынас процестерінің моделі Go-де қолайлы болғанымен, бұл жалғыз емес: бағдарламадағы барлық горутиндер бір мекен-жай кеңістігін пайдаланады. Бұл дегеніміз, өзгермелі нысандар мен көрсеткіштерді горутиндер арасында бөлуге болады; қараңыз § жарыс жағдайы қауіпсіздігінің болмауы, төменде.[дәйексөз қажет ]

Параллель бағдарламалауға жарамдылығы

Go-дің параллельдік ерекшеліктері бірінші кезекте бағытталған емес параллель өңдеу,[79] оларды бағдарламалау үшін пайдалануға болады ортақ жады көп процессор машиналар. Бұл тәсілдің тиімділігі туралы әртүрлі зерттеулер жасалды.[89] Осы зерттеулердің бірі өлшемін салыстырды (дюйм) код жолдары ) және тілді білмейтін тәжірибелі бағдарламашының жазған бағдарламаларының жылдамдығы және Go бағдарламасының маманы (Google әзірлеушілер тобынан) осы бағдарламаларға түзетулер енгізуі керек. Шіркеу, Цилк және Intel TBB. Зерттеу барысында сарапшы емес адам жазуға бейім екендігі анықталды бөлу және жеңу біреуімен алгоритмдер жүр бір рекурсияға арналған мәлімдеме, ал сарапшы бір процессорға бір горутинді қолданып, үлестіру-синхрондау бағдарламаларын жазды. Сарапшының бағдарламалары әдетте жылдамырақ, сонымен қатар ұзақ болатын.[90]

Жарыс жағдайы қауіпсіздігінің жоқтығы

Горутиндердің ортақ деректерге қол жеткізуіне, жасауына ешқандай шектеулер жоқ жарыс шарттары мүмкін. Нақтырақ айтсақ, егер бағдарлама арналармен немесе басқа тәсілдермен нақты синхрондалмаса, бір горутиннен жазбалар ішінара, толығымен немесе мүлдем көрінбеуі мүмкін, көбіне жазбаларға тапсырыс беруге кепілдік берілмейді.[88] Сонымен қатар, Go's ішкі деректер құрылымдары интерфейс мәндері, кесінді тақырыптары, хэш кестелері және жол тақырыптары жарыс жағдайларына қарсы емес, сондықтан синхрондаусыз сол типтердің ортақ даналарын өзгертетін көп тізбекті бағдарламаларда тип пен жад қауіпсіздігі бұзылуы мүмкін.[91][92] Тілдік қолдаудың орнына қауіпсіз бір уақытта бағдарламалау конвенцияларға сүйенеді; мысалы, Чисналл «бүркеншік аттар» деген идиоманы ұсынады xor өзгеретін «, яғни өзгертілетін мәнді (немесе көрсеткішті) канал арқылы беру меншік құқығының оның қабылдағышына құндылыққа ауысуын білдіреді.[80]:155

Екілік файлдар

Gc құралдар тізбегіндегі сілтеме әдепкі бойынша статикалық байланысқан екілік файлдарды жасайды, сондықтан барлық Go екілік файлдары Go жұмыс уақытын қамтиды.[93][94]

Өткізу

Go басқа тілдерде кездесетін кейбір ерекшеліктерді, оның ішінде әдейі жоққа шығарады (іске асыру) мұрагерлік, жалпы бағдарламалау, бекітулер,[e] көрсеткіш арифметикасы,[d] түрлендірулер, белгісіз кәсіподақтар,[f] және белгіленген кәсіподақтар.[g] Дизайнерлер тек үшеуі келіскен нысандарды ғана қосты.[97]

Түсірілмеген тілдік ерекшеліктердің ішінен дизайнерлер бекітулер мен көрсеткіш арифметикасына қарсы нақты пікір айтады, сонымен бірге типті мұрагерліктен бас тарту таңдауды неғұрлым пайдалы тіл беріп, оның орнына пайдалануды қолдайды интерфейстер жету динамикалық диспетчер[h] және құрамы кодты қайта пайдалану. Құрамы және делегация негізінен автоматтандырылған құрылым ендіру; зерттеушілер Шмагердің айтуы бойынша т.б., бұл функцияда «мұраның көптеген кемшіліктері бар: ол объектілердің жалпы интерфейсіне әсер етеді, ол ұсақ емес (яғни, ендіруді әдіс деңгейінде бақылау жоқ), ендірілген нысандардың әдістерін жасыру мүмкін емес және ол тұрақты «, бағдарламашылар оны басқа тілдердегі бағдарламашылар мұраны асыра пайдаланған деген атаққа ие болатын дәрежеде оны асыра пайдаланатындығын» айқын емес «етеді.[62]

Дизайнерлер жалпы бағдарламалауға ашықтығын білдіреді және кіріктірілген функцияларға назар аударады болып табылады іс жүзінде типтік, бірақ бұл ерекше жағдайлар ретінде қарастырылады; Шортан мұны бір кездері өзгеруі мүмкін әлсіздік деп атайды.[54] Google командасы генериктермен бірге эксперименттік Go диалектісі үшін кем дегенде бір компилятор жасады, бірақ оны шығармады.[98] Олар кодты генерациялауды стандарттау тәсілдеріне ашық.[99] 2020 жылдың маусымында жаңа жобалық құжат жобасы[100] жалпы функциялар мен типтерді жариялау үшін Go-ге қажетті синтаксисті қосатын жарық көрді. Кодты аудару құралы go2go пайдаланушыларға жаңа синтаксисті, сонымен қатар онлайн Go Playground-тің жалпы қолданыстағы нұсқасымен бірге байқап көруге мүмкіндік беру үшін ұсынылды.[101]

Бастапқыда алынып тасталды ерекшелік - тәрізді дүрбелең/қалпына келтіру соңында механизм қосылды, оны Go авторлары қалпына келтірілмейтін қателіктер үшін қолдануға кеңес береді, мысалы, бүкіл бағдарламаны немесе сервер сұранысын тоқтатуы керек немесе қателерді бумадағы стекке дейін тарату үшін жарлық ретінде (бірақ бума шекарасында емес; қате стандартты API).[102][103][104][105]

Стиль

Go авторлары Go бағдарламаларының стиліне әсер ету үшін айтарлықтай күш жұмсады:

  • Шегініс, аралық және кодтың басқа беткі деңгей бөлшектері автоматты түрде стандартталған gofmt құрал. голинт автоматты түрде қосымша стиль тексерулерін жасайды.
  • Go-мен таратылған құралдар мен кітапханалар API құжаттары сияқты стандартты тәсілдерді ұсынады (годок),[106] тестілеу (сынақтан өту), ғимарат (бару), пакетті басқару (бару), және тағы басқа.
  • Go басқа тілдерде ұсынылған ережелерді қолданады, мысалы, циклдік тәуелділіктерге, пайдаланылмаған айнымалыларға немесе импортқа тыйым салу және түрді жасырын түрлендіруге тыйым салу.
  • The жіберіп алу кейбір функциялар (мысалы, функционалды-бағдарламалау төте жолдары) карта және Java стилінде тырысу/ақыры блоктар) нақты, нақты және императивті бағдарламалау стилін ынталандыруға бейім.
  • Бір күні Go тобы Go идиомаларының жинағын шығарды,[106] және кейінірек кодты шолу пікірлерін жинады[107] келіссөздер,[108] және ресми блог жазбалары[109] Go стилін және кодтау философиясын үйрету.

Құралдар

Go негізгі таратылымына арналған құралдар кіреді ғимарат, тестілеу, және талдау коды:

  • бару, бұл бастапқы файлдардағы ақпараттарды ғана қолданатын Go екілік файлдарын жасайды, бөлек файлдар жоқ
  • сынақтан өту, қондырғыны сынау және микробенмарктар үшін
  • жүру, кодты пішімдеу үшін
  • бару, қашықтағы бумаларды алуға және орнатуға арналған
  • ветеринарға бару, кодтағы ықтимал қателерді іздейтін статикалық анализатор
  • жүгіру, код құру және орындау үшін жарлық
  • годок, құжаттаманы көрсету немесе оны HTTP арқылы қызмет ету үшін
  • горенам, айнымалыларды, функцияларды және т.с.с. түрлерін қауіпсіз түрде өзгерту үшін
  • генерациялаңыз, код генераторларын шақырудың стандартты тәсілі

Ол сонымен қатар кіреді профильдеу және түзету қолдау, жұмыс уақыты аспаптар (мысалы, бақылау үшін) қоқыс шығару үзілістер) және а жарыс жағдайы сынаушы.

Үшінші тарап құралдарының экожүйесі, мысалы, стандартты таралуға қосылады гокодкөптеген мәтіндік редакторларда кодты автоматты түрде толтыруға мүмкіндік береді, гимпорттар, бұл қажет болған жағдайда пакеттің импортын автоматты түрде қосады / жояды және қате, ол қателерді елемей қалуы мүмкін кодты анықтайды.

Мысалдар

Сәлем Әлем

пакет негізгіимпорт «fmt»функциясы негізгі() {    fmt.Басып шығару(«Сәлем Әлем!»)}

Мұндағы «fmt» пакеті форматталған Енгізу / шығару, C-ге ұқсас C файлын енгізу / шығару.[110]

Параллельдік

Келесі қарапайым бағдарлама Go's бағдарламасын көрсетеді параллельдік ерекшеліктері асинхронды бағдарламаны жүзеге асыру. Ол екі жеңіл жіпті іске қосады («горутиндер»): біреуі пайдаланушыдан қандай-да бір мәтін теруді күтеді, ал екіншісі күту уақытын жүзеге асырады. The таңдаңыз мәлімдеме осы горутиндердің кез-келгені негізгі күнтізбеге хабарлама жіберуін күтеді және бірінші келген хабарлама бойынша әрекет етеді (мысал, Дэвид Чисналл кітабынан алынған).[80]:152

пакет негізгіимпорт (    «fmt»    «уақыт»)функциясы оқылған сөз(ш чан жіп) {    fmt.Басып шығару(«Сөзді теріп, Enter пернесін басыңыз.»)    var сөз жіп    fmt.Сканер(«% s», &сөз)    ш <- сөз}функциясы үзіліс(т чан bool) {    уақыт.Ұйқы(5 * уақыт.Екінші)    т <- жалған}функциясы негізгі() {    т := жасау(чан bool)    жүр үзіліс(т)    ш := жасау(чан жіп)    жүр оқылған сөз(ш)    таңдаңыз {    іс сөз := <-ш:        fmt.Басып шығару(«Алынды», сөз)    іс <-т:        fmt.Басып шығару(«Үзіліс.»)    }}

Тестілеу

Мақсатты функция мысалы:

функциясы Пайдаланушы атын шығарып алыңыз(электрондық пошта жіп) жіп {	кезінде := жіптер.Көрсеткіш(электрондық пошта, "@")	қайту электрондық пошта[:кезінде]}

Сынақ коды (ескеріңіз бекіту Go-де кілт сөз жоқ; тестілер _test.go сайтында сол пакетте болады):

импорт (    «тестілеу»    )функциясы TestExtractUsername(т *тестілеу.Т) {	т.Жүгіру(«withoutDot», функциясы(т *тестілеу.Т) {		пайдаланушы аты := Пайдаланушы атын шығарып алыңыз(«[email protected]»)		егер пайдаланушы аты != «r» {			т.Фатальф(«Түсіндім:% v  n», пайдаланушы аты)		}	})	т.Жүгіру(«withDot», функциясы(т *тестілеу.Т) {		пайдаланушы аты := Пайдаланушы атын шығарып алыңыз(«[email protected]»)		егер пайдаланушы аты != «jonh.smith» {			т.Фатальф(«Түсіндім:% v  n», пайдаланушы аты)		}	})}

Тесттерді қатар жүргізуге болады.

Қолданбалар

Кейбірі назар аударарлық ашық көзі Go-де жазылған өтінімдерге мыналар жатады:[111]

  • Кэдди, ашық HTTP / 2 веб-сервері, автоматты HTTPS мүмкіндігі бар.
  • ТарақанDB, ашық көз, өмір сүруге болатын, дәйекті, ауқымды SQL дерекқоры.
  • Докер, орналастыруға арналған құралдар жиынтығы Linux контейнерлер
  • Ethereum, The go-ethereum үшін Ethereum виртуалды машинасының блокчейнін енгізу Эфир криптовалюта [112]
  • Гюго, статикалық сайт генераторы
  • InfluxDB, қол жетімділігі жоғары және өнімділігі жоғары уақыт тізбегіндегі деректерді өңдеуге арналған ашық бастапқы дерекқор.
  • Планетааралық файлдық жүйе, мазмұнға бағытталған, бір деңгейден гипермедиа протоколы.[113]
  • Джудзу, сервистік оркестр құралы Канондық, пакеттерінің Ubuntu Linux
  • Кубернет контейнерлерді басқару жүйесі
  • lnd, жүзеге асыру Bitcoin Найзағай желісі.[114]
  • Маңызды, teamchat жүйесі
  • NATS хабарламалары, бұл өнімділіктің, масштабтылықтың және пайдаланудың қарапайымдылығының негізгі жобалық принциптерін қамтитын ашық көзді хабарлама жүйесі.[115]
  • OpenShift, қызмет ретінде бұлтты есептеу платформасы Қызыл қалпақ
  • Rclone, бұлтты сақтау қоймасындағы файлдарды басқаруға арналған командалық жол бағдарламасы және басқа жоғары кідірісті қызметтер.
  • Snappy, пакет менеджері Ubuntu Touch Canonical әзірледі.
  • Синхрондау, ашық кодты файлды синхрондау клиенті / сервер қосымшасы
  • Терраформ, ашық көзі, бірнеше бұлт бастап инфрақұрылымды қамтамасыз ету құралы HashiCorp.
  • TiDB, ашық көзі, таратылған HTAP PingCAP-тен MySQL протоколымен үйлесімді мәліметтер базасы.

Go қолданатын басқа танымал компаниялар мен сайттарға (әдетте басқа тілдермен бірге) жатады:

  • Какуа, Go және gRPC көмегімен пайдаланушының бақылау тақтасы мен микросервисті көрсеткені үшін.[116]
  • Чанго, бағдарламалық жарнама компаниясы Go-ді өзінің нақты уақыттағы сауда-саттық жүйесінде қолданады.[117]
  • Бұлтты құю, а қызмет ретінде платформа[118]
  • Бұлт, олардың дельта-кодтау прокси-жүйесі үшін Railgun, олардың таратылған DNS қызметі, сондай-ақ криптография, журнал жасау, ағынды өңдеу және SPDY сайттарына кіру құралдары.[119][120]
  • Linux контейнері (бұрынғы CoreOS), Linux негізіндегі операциялық жүйе қолданады Докер контейнерлер[121] және rkt контейнерлер.
  • Couchbase Couchbase серверіндегі сұраныстар және индекстеу қызметтері[122]
  • Dropbox, олардың кейбір маңызды компоненттері Python-дан Go-ға көшті[123]
  • Google, көптеген жобалар үшін, атап айтқанда жүктеу сервері dl.google.com[124][125][126]
  • Героку, Doozer үшін құлыптау қызметі[15]
  • Hyperledger матасы, ашық көзі, кәсіпорынға бағытталған таратылған кітап жобасы
  • MongoDB, MongoDB даналарын басқаруға арналған құралдар[127]
  • Netflix, олардың сервер архитектурасының екі бөлігі үшін[128]
  • Нутаникс, оның Enterprise Cloud ОЖ-дегі әртүрлі микро қызметтер үшін.[129]
  • Plug.dj, интерактивті желідегі әлеуметтік музыкалық веб-сайт.[130]
  • SendGrid, Боулдер, Колорадоға негізделген транзакциялық электрондық поштаны жеткізу және басқару қызметі.[131]
  • SoundCloud, «ондаған жүйелер» үшін[132]
  • Бөлім, Интернеттегі музыкалық ынтымақтастық платформасының бүкіл артқы жағында (API және талдаушылар).[133]
  • ThoughtWorks, үшін кейбір құралдар мен қосымшалар үздіксіз жеткізу және жедел хабарламалар (CoyIM).[134]
  • Twitch, олардың IRC негізіндегі сөйлесу жүйесі үшін (Python-дан көшірілген).[135]
  • Uber, жоғары көлемін өңдеу үшін геофент негізделген сұраулар.[136]

Қабылдау

Интерфейс жүйесі және мұрагерліктің әдейі алынып тасталуы Мишель Симионато тарапынан жоғары бағаланды, ол осы сипаттамаларды осы сипаттамалармен салыстырды Стандартты ML, оны «бірде-бір танымал тіл [бұл] нақты жолмен жүрмегені ұят” деп атады.[137]

Dave Astels сағ Қозғалтқыш алаңы жазды:[138]

Go-ға сүңгу өте оңай. Негізгі тілдік ұғымдардың минималды саны және синтаксис таза және түсінікті етіп жасалған болып табылады әлі эксперименталды және әлі де шетінен сәл өрескел.

Go бағдарламасы бойынша жылдың бағдарламалау тілі атанды TIOBE бағдарламалау қауымдастығы индексі 2009 жылдың бірінші жылында, сол жылдағы басқа тілдерден гөрі танымалдығының 12 айға жоғарылағаны үшін (қарашада қолданысқа енгізілгеннен кейін 2 айда ғана) және 2010 жылдың қаңтарында 13-орынға жетті,[139] сияқты қалыптасқан тілдерді басып озу Паскаль. 2015 жылдың маусымына қарай оның рейтингі индекстегі 50-ден төмен түсіп, оны төменге орналастырды COBOL және Фортран.[140] Бірақ 2017 жылдың қаңтарынан бастап оның рейтингі 13-ке көтерілді, бұл танымалдылық пен асырап алудың айтарлықтай өсуін көрсетті. Go 2016 жылдың TIOBE бағдарламалау тілімен марапатталды.

Брюс Эккел мәлімдеді:[141]

Күрделілігі C ++ (жаңа С ++ -ке одан да күрделілік қосылды), ал нәтижелілікке әсер ету енді өзін ақтамайды. Си-үйлесімді тілді қолдану үшін C ++ бағдарламашысы секіруге мәжбүр болған барлық құрсаудың мағынасы болмайды - олар тек уақыт пен күш жұмсау болып табылады. Go C ++ бастапқыда шешуге арналған мәселелер класы үшін әлдеқайда мағыналы.

2011 жылы тілді бағалау және оны бағалау gc C ++ (GCC ), Java және Скала Google инженері тапты:

Go қызықты және тілдік мүмкіндіктерді ұсынады, бұл сонымен қатар қысқа әрі стандартталған жазба жасауға мүмкіндік береді. Бұл тіл үшін компиляторлар әлі жетілмеген, олар өнімділікте де, екілік өлшемдерде де көрінеді.

— Р. Хундт[142]

Бағалау Go дамытушылар тобынан жоққа шығарылды. Ян Ланс Тейлор, Хундтың қағазына арналған Go кодын жақсартқан, өзінің кодын жариялау ниеті туралы білмеген және оның нұсқасы «ешқашан идиомалық немесе тиімді Go-дің үлгісі болмағаны» туралы айтады; Russ Cox then optimized the Go code, as well as the C++ code, and got the Go code to run slightly faster than C++ and more than an order of magnitude faster than the code in the paper.[143]

Атаулар туралы дау

On November 10, 2009, the day of the general release of the language, Francis McCabe, developer of the Бар! бағдарламалау тілі (note the exclamation point), requested a name change of Google's language to prevent confusion with his language, which he had spent 10 years developing.[144] McCabe raised concerns that "the 'big guy' will end up steam-rollering over" him, and this concern resonated with the more than 120 developers who commented on Google's official issues thread saying they should change the name, with some[145] even saying the issue contradicts Google's motto of: Зұлым болмаңыз.[146]

On October 12, 2010, the issue was closed by Google developer Russ Cox (@rsc) with the custom status "Unfortunate" accompanied by the following comment:

"There are many computing products and services named Go. In the 11 months since our release, there has been minimal confusion of the two languages."[146]

Сын

Go critics say that:

  • Жетіспеушілігі параметрлік полиморфизм үшін жалпы бағдарламалау әкеледі code duplication or unsafe type conversions and flow-disrupting verbosity.[147][148][149][150]
  • Go's нөл combined with the lack of algebraic types leads to difficulty handling failures and base cases.[147][149]
  • Go does not allow an opening brace to appear on its own line, which forces all Go programmers to use the same brace style.[151]
  • File semantics in Go standard library are heavily based on POSIX semantics, and they do not map well to the Windows platform.[152][153] Note that this problem is not particular to Go, but other programming languages have solved it through well defined standard libraries. The author also argues that Go's simplicity is an illusion and that to solve real world problems, libraries with surprisingly large dependencies need to be pulled in to solve something as simple as implementing a monotonically increasing time function.

Сондай-ақ қараңыз

Ескертулер

  1. ^ But "To allow complex statements to occupy a single line, a semicolon may be omitted before a closing ) or }".[50]
  2. ^ “if the newline comes after a token that could end a statement, [the lexer will] insert a semicolon”.[51]
  3. ^ Usually, exactly one of the result and error values has a value other than the type's zero value; sometimes both do, as when a read or write can only be partially completed, and sometimes neither, as when a read returns 0 bytes. Қараңыз Semipredicate problem: Multivalued return.
  4. ^ а б Language FAQ "Why is there no pointer arithmetic? Safety … never derive an illegal address that succeeds incorrectly … using array indices can be as efficient as … pointer arithmetic … simplify the implementation of the garbage collector…."[12]
  5. ^ Language FAQ "Why does Go not have assertions? …our experience has been that programmers use them as a crutch to avoid thinking about proper error handling and reporting…."[12]
  6. ^ Language FAQ "Why are there no untagged unions…? [they] would violate Go's memory safety guarantees."[12]
  7. ^ Language FAQ "Why does Go not have variant types? … We considered [them but] they overlap in confusing ways with interfaces…. [S]ome of what variant types address is already covered, … although not as elegantly."[12] (The tag of an interface type[95] is accessed with a type assertion[96]).
  8. ^ Questions "How do I get dynamic dispatch of methods?" and "Why is there no type inheritance?" in the language FAQ.[12]

Әдебиеттер тізімі

  1. ^ "First-Class Functions in Go". Алынған 14 қараша, 2018. Go supports ... a functional programming style in a strongly typed language.
  2. ^ "Is Go an object-oriented language?". Алынған 13 сәуір, 2019. Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy.
  3. ^ "Go: code that grows with grace". Алынған 24 маусым, 2018. Go is Object Oriented, but not in the usual way.
  4. ^ а б "Text file LICENSE". The Go Programming Language. Алынған 5 қазан, 2012.
  5. ^ "Release History". Алынған 5 желтоқсан, 2020.
  6. ^ а б "Why doesn't Go have "implements" declarations?". golang.org. Алынған 1 қазан, 2015.
  7. ^ Pike, Rob (December 22, 2014). "Rob Pike on Twitter". Алынған 13 наурыз, 2016. Go has structural typing, not duck typing. Full interface satisfaction is checked and required.
  8. ^ "lang/go: go-1.4 – Go programming language". OpenBSD порттары. 23 желтоқсан, 2014 ж. Алынған 19 қаңтар, 2015.
  9. ^ "Go Porting Efforts". Go Language Resources. cat-v. 2010 жылғы 12 қаңтар. Алынған 18 қаңтар, 2010.
  10. ^ "Additional IP Rights Grant". The Go Programming Language. Алынған 5 қазан, 2012.
  11. ^ а б Pike, Rob (April 24, 2014). "Hello Gophers". Алынған 11 наурыз, 2016.
  12. ^ а б c г. e f ж "Language Design FAQ". golang.org. 2010 жылғы 16 қаңтар. Алынған 27 ақпан, 2010.
  13. ^ "The Evolution of Go". Алынған 26 қыркүйек, 2015.
  14. ^ Kincaid, Jason (November 10, 2009). "Google's Go: A New Programming Language That's Python Meets C++". TechCrunch. Алынған 18 қаңтар, 2010.
  15. ^ а б Metz, Cade (May 5, 2011). "Google Go boldly goes where no code has gone before". Тізілім.
  16. ^ "Is the language called Go or Golang?". Алынған 26 наурыз, 2020. The language is called Go.
  17. ^ "Go 1.5 Release Notes". Алынған 28 қаңтар, 2016. The compiler and runtime are now implemented in Go and assembler, without C.
  18. ^ Metz, Cade (August 19, 2015). "Google's In-House Programming Language Now Runs on Phones". wired.com.
  19. ^ "Go 1.11 is Released - The Go Blog". 24 тамыз 2018 жыл. Алынған 1 қаңтар, 2019.
  20. ^ "FAQ: Implementation". golang.org. 2010 жылғы 16 қаңтар. Алынған 18 қаңтар, 2010.
  21. ^ "Installing GCC: Configuration". Алынған 3 желтоқсан, 2011. Ada, Go and Objective-C++ are not default languages
  22. ^ "A compiler from Go to JavaScript for running Go code in a browser: Gopherjs/Gopherjs". April 18, 2020.
  23. ^ "Go at Google: Language Design in the Service of Software Engineering". Алынған 8 қазан, 2018.
  24. ^ Pike, Rob (April 28, 2010). "Another Go at Language Design". Stanford EE Computer Systems Colloquium. Стэнфорд университеті. Video available.
  25. ^ "Frequently Asked Questions (FAQ) - The Go Programming Language". golang.org. Алынған 26 ақпан, 2016.
  26. ^ Binstock, Andrew (May 18, 2011). "Dr. Dobb's: Interview with Ken Thompson". Алынған 7 ақпан, 2014.
  27. ^ Pike, Rob (2012). "Less is exponentially more".
  28. ^ Griesemer, Robert (2015). "The Evolution of Go".
  29. ^ Griesemer, Robert; Шортан, Роб; Томпсон, Кен; Тейлор, Ян; Cox, Russ; Kim, Jini; Langley, Adam. "Hey! Ho! Let's Go!". Google Open Source. Алынған 17 мамыр, 2018.
  30. ^ Shankland, Stephen (March 30, 2012). "Google's Go language turns one, wins a spot at YouTube: The lower-level programming language has matured enough to sport the 1.0 version number. And it's being used for real work at Google". Жаңалықтар CNet. CBS Interactive Inc. Алынған 6 тамыз, 2017. Google has released version 1 of its Go programming language, an ambitious attempt to improve upon giants of the lower-level programming world such as C and C++.
  31. ^ "Release History - The Go Programming Language". golang.org.
  32. ^ "Go FAQ: Is Google using Go internally?". Алынған 9 наурыз, 2013.
  33. ^ "Go fonts – The Go Blog". Барыңыз. 2016 жылғы 16 қараша. Алынған 12 наурыз, 2019.
  34. ^ "Go Font TTFs". GitHub. Алынған 2 сәуір, 2019.
  35. ^ "Go's New Brand". The Go Blog. Алынған 9 қараша, 2018.
  36. ^ "Go 2 Draft Designs". Алынған 12 қыркүйек, 2018.
  37. ^ "The Go Blog: Go 2 Draft Designs". 28 тамыз 2018 ж.
  38. ^ "Go 1 and the Future of Go Programs - The Go Programming Language". golang.org.
  39. ^ "Go 1.14 Release Notes - The Go Programming Language". golang.org.
  40. ^ "Release History - The Go Programming Language". golang.org.
  41. ^ "Release History". The Go Programming Language. Алынған 24 тамыз, 2018.
  42. ^ "Go 1.11 Release Notes – the Go Programming Language".
  43. ^ "Understanding Golang TLS mutual authentication DoS – CVE-2018-16875". 19 желтоқсан 2018 ж.
  44. ^ а б "Go 1.14 Release Notes – the Go Programming Language".
  45. ^ Pike, Rob. "The Go Programming Language". YouTube. Алынған 1 шілде 2011.
  46. ^ Pike, Rob (November 10, 2009). The Go Programming Language (flv) (Tech talk). Google. Event occurs at 8:53.
  47. ^ Download and install packages and dependencies - go - The Go Programming Language; қараңыз godoc.org for addresses and documentation of some packages.
  48. ^ "GoDoc". godoc.org.
  49. ^ Rob Pike, on The Changelog подкаст.
  50. ^ "Go Programming Language Specification, §Semicolons". golang.org.
  51. ^ "Effective Go, §Semicolons". golang.org.
  52. ^ Rob Pike, Strings, bytes, runes and characters in Go, October 23, 2013.
  53. ^ Doxsey, Caleb. "Structs and Interfaces — An Introduction to Programming in Go". www.golang-book.com. Алынған 15 қазан, 2018.
  54. ^ а б Pike, Rob (September 26, 2013). "Arrays, slices (and strings): The mechanics of 'append'". The Go Blog. Алынған 7 наурыз, 2015.
  55. ^ Andrew Gerrand, Go Slices: usage and internals.
  56. ^ The Go Authors, Effective Go: Slices.
  57. ^ The Go authors Selectors - The Go Programming Language Specification және Calls - The Go Programming Language Specification.
  58. ^ "Go Programming Language Specification, §Package unsafe". golang.org.
  59. ^ "The Go Programming Language Specification". golang.org.
  60. ^ "The Go Programming Language Specification". golang.org.
  61. ^ "The Go Programming Language Specification". golang.org.
  62. ^ а б 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.
  63. ^ а б Summerfield, Mark (2012). Programming in Go: Creating Applications for the 21st Century. Аддисон-Уэсли.
  64. ^ а б c г. e Balbaert, Ivo (2012). The Way to Go: A Thorough Introduction to the Go Programming Language. iUniverse.
  65. ^ "The Evolution of Go". talks.golang.org. Алынған 13 наурыз, 2016.
  66. ^ Diggins, Christopher (November 24, 2009). "Duck Typing and the Go Programming Language". Доктор Доббтың. Алынған 10 наурыз, 2016.
  67. ^ Ryer, Mat (December 1, 2015). "Duck typing in Go". Алынған 10 наурыз, 2016.
  68. ^ "Frequently Asked Questions (FAQ) - The Go Programming Language". golang.org.
  69. ^ "The Go Programming Language Specification". golang.org.
  70. ^ "The Go Programming Language Specification". golang.org.
  71. ^ reflect.ValueOf(i interface{}) converts an интерфейс {} а reflect.Value that can be further inspected
  72. ^ "map[string]interface{} in Go". bitfieldconsulting.com.
  73. ^ "Go Data Structures: Interfaces". Алынған 15 қараша, 2012.
  74. ^ "The Go Programming Language Specification". golang.org.
  75. ^ "A Tutorial for the Go Programming Language". The Go Programming Language. Алынған 10 наурыз, 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.
  76. ^ "go - The Go Programming Language". golang.org.
  77. ^ "How to Write Go Code". golang.org. 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 an Example account at example.com/user, that should be your base path
  78. ^ "Go Packaging Proposal Process". Google Docs.
  79. ^ а б Rob Pike, Concurrency is not Parallelism.
  80. ^ а б c г. e Chisnall, David (2012). The Go Programming Language Phrasebook. Аддисон-Уэсли. ISBN  9780132919005.
  81. ^ "Effective Go". golang.org.
  82. ^ "The Go Memory Model". Алынған 10 сәуір, 2017.
  83. ^ "Go Concurrency Patterns". golang.org.
  84. ^ John Graham-Cumming, Recycling Memory Buffers in Go
  85. ^ "tree.go".
  86. ^ Ewen Cheslack-Postava, Iterators in Go.
  87. ^ Brian W. Kernighan, A Descent Into Limbo
  88. ^ а б "The Go Memory Model". Алынған 5 қаңтар, 2011.
  89. ^ Tang, Peiyi (2010). Multi-core parallel programming in Go (PDF). Proc. First International Conference on Advanced Computing and Communications.
  90. ^ Nanz, Sebastian; West, Scott; Soares Da Silveira, Kaue. Examining the expert gap in parallel programming (PDF). Euro-Par 2013. CiteSeerX  10.1.1.368.6137.
  91. ^ Russ Cox, Жарысқа жол жоқ.
  92. ^ Pike, Rob (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."
  93. ^ "Frequently Asked Questions (FAQ) - the Go Programming Language".
  94. ^ "A Story of a Fat Go Binary". 21 қыркүйек 2018 жыл.
  95. ^ "Go Programming Language Specification, §Interface types". golang.org.
  96. ^ "Go Programming Language Specification, §Type assertions". golang.org.
  97. ^ All Systems Are Go. informIT. 2010 жылғы 17 тамыз. Алынған 21 маусым, 2018.
  98. ^ "E2E: Erik Meijer and Robert Griesemer – Going Go". 9 арна. Microsoft. May 7, 2012.
  99. ^ Rob Pike, Generating code
  100. ^ "Type Parameters - Draft Design". go.googlesource.com.
  101. ^ "Generics in Go". bitfieldconsulting.com.
  102. ^ Panic And Recover, Go wiki
  103. ^ "Weekly Snapshot History". golang.org.
  104. ^ "Proposal for an exception-like mechanism". golang-nuts. 25 наурыз, 2010 жыл. Алынған 25 наурыз, 2010.
  105. ^ "Effective Go". golang.org.
  106. ^ а б "Effective Go". golang.org.
  107. ^ "Code Review Comments". Алынған 3 шілде, 2018.
  108. ^ "Talks". Алынған 3 шілде, 2018.
  109. ^ "Errors Are Values". Алынған 3 шілде, 2018.
  110. ^ "fmt - The Go Programming Language". golang.org. Алынған 8 сәуір, 2019.
  111. ^ avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software, алынды 10 қаңтар, 2018
  112. ^ "Official Go implementation of the Ethereum protocol". GitHub. ethereum. April 18, 2020.
  113. ^ "ipfs/go-ipfs". GitHub. Алынған 1 маусым, 2018.
  114. ^ "lightningnetwork/lnd", GitHub, алынды 29 сәуір, 2020
  115. ^ "NATS - Open Source Messaging System | Secure, Native Cloud Application Development".
  116. ^ "Test driven development in Go | Cacoo". Cacoo. 2016 жылғы 29 шілде. Алынған 1 маусым, 2018.
  117. ^ "Chango". GitHub.
  118. ^ Heller, Martin (July 17, 2014). "Review: Cloud Foundry brings power and polish to PaaS". JavaWorld. Алынған 22 қаңтар, 2019.
  119. ^ John Graham-Cumming, Go at CloudFlare
  120. ^ John Graham-Cumming, What we've been doing with Go
  121. ^ "Go at CoreOS". 25 қараша, 2014 ж.
  122. ^ "Couchbase". GitHub.
  123. ^ Patrick Lee, Open Sourcing Our Go Libraries, July 7, 2014.
  124. ^ "dl.google.com: Powered by Go". golang.org.
  125. ^ Matt Welsh, Rewriting a Large Production System in Go
  126. ^ David Symonds, High Performance Apps on Google App Engine
  127. ^ "Mongo DB". GitHub. April 18, 2020.
  128. ^ "The Netflix Tech Blog: Application data caching using SSDs". 2016 жылғы 25 мамыр.
  129. ^ "golang/go". GitHub. April 18, 2020.
  130. ^ Steven Sacks. "Search & Advances". plug.dj tech blog. Архивтелген түпнұсқа 2015 жылғы 11 маусымда. Алынған 10 маусым, 2015.
  131. ^ Tim Jenkins (March 6, 2014). "How to Convince Your Company to Go With Golang". SendGrid's Email Deliverability Blog.
  132. ^ Peter Bourgon, Go at SoundCloud Мұрағатталды 2013 жылғы 11 қараша, сағ Wayback Machine
  133. ^ "Go at Google I/O and Gopher SummerFest - The Go Blog". golang.org.
  134. ^ TWSTRIKE (April 17, 2020). "CoyIM". ThoughtWorks STRIKE team.
  135. ^ Rhys Hiltner, Go’s march to low-latency GC, 2016 жылғы 5 шілде.
  136. ^ "How We Built Uber Engineering's Highest Query per Second Service Using Go". Uber Engineering Blog. 24 ақпан, 2016. Алынған 2 наурыз, 2016.
  137. ^ Simionato, Michele (November 15, 2009). "Interfaces vs Inheritance (or, watch out for Go!)". artima. Алынған 15 қараша, 2009.
  138. ^ Astels, Dave (November 9, 2009). "Ready, Set, Go!". engineyard. Алынған 9 қараша, 2009.
  139. ^ jt (January 11, 2010). "Google's Go Wins Programming Language Of The Year Award". jaxenter. Алынған 5 желтоқсан, 2012.
  140. ^ "TIOBE Programming Community Index for June 2015". TIOBE Software. Маусым 2015. Алынған 5 шілде, 2015.
  141. ^ Bruce Eckel (August 27, 2011). "Calling Go from Python via JSON-RPC". Алынған 29 тамыз, 2011.
  142. ^ Hundt, Robert (2011). Loop recognition in C++/Java/Go/Scala (PDF). Scala Days.
  143. ^ Metz, Cade (July 1, 2011). "Google Go strikes back with C++ bake-off". Тізілім.
  144. ^ Brownlee, John (November 13, 2009). "Google didn't google "Go" before naming their programming language'".
  145. ^ Claburn, Thomas (November 11, 2009). "Google 'Go' Name Brings Accusations Of Evil'". Ақпараттық апта. Алынған 18 қаңтар, 2010.
  146. ^ а б "Issue 9 - go — I have already used the name for *MY* programming language". Github. Google Inc. Алынған 12 қазан, 2010.
  147. ^ а б Yager, Will. "Why Go is not Good". Алынған 4 қараша, 2018.
  148. ^ Elbre, Egon. "Summary of Go Generics discussions". Алынған 4 қараша, 2018.
  149. ^ а б Dobronszki, Janos. "Everyday Hassles in Go". Алынған 4 қараша, 2018.
  150. ^ Fitzpatrick, Brad. "Go: 90% Perfect, 100% of the time". Алынған 28 қаңтар, 2016.
  151. ^ "Why are there braces but no semicolons? And why can't I put the opening brace on the next line?". Алынған 26 наурыз, 2020. The advantages of a single, programmatically mandated format for all Go programs greatly outweigh any perceived disadvantages of the particular style.
  152. ^ "I want off Mr. Golang's Wild Ride". 28 ақпан, 2020. Алынған 17 қараша, 2020.
  153. ^ "proposal: os: Create/Open/OpenFile() set FILE_SHARE_DELETE on windows #32088". 16 мамыр, 2019. Алынған 17 қараша, 2020.

Әрі қарай оқу

Сыртқы сілтемелер