Go (dasturlash tili). Go bu Google da Robert Griesemer, Rob Pike va Ken Tompson tomonidan ishlab chiqilgan statik tarzda terilgan, kompilyatsiya qilingan dasturlash tilidir. U sintaktik jihatdan C ga o'xshaydi, lekin xotira xavfsizligi, axlat yig'ish, tizimli yozish, va CSP uslubidagi parallellik bilan. Ilgari codice_1 domen nomi tufayli u ko'pincha Golang deb ataladi, lekin uning to'g'ri nomi Go. Uchinchi tomon manbadan manbaga kompilyator, GopherJS, kompilyatsiya qiladi Front-end veb-ishlab chiqish uchun JavaScript -ga o'ting. Tarixi. Go 2007-yilda Google'da ko'p yadroli, tarmoqli mashinalar va katta kod bazalari davrida dasturlash samaradorligini oshirish uchun ishlab chiqilgan. Dizaynerlar Google -da qo'llaniladigan boshqa tillarning tanqidiga murojaat qilishni xohlashdi, lekin ularning foydali xususiyatlarini saqlab qolishdi: Uning dizaynerlari, birinchi navbatda, C++ tilini yoqtirmasliklari sabab bo'lgan. Go 2009-yil noyabr oyida ommaga e'lon qilindi va 1.0 versiyasi 2012-yil mart oyida chiqarildi Go Google va boshqa koʻplab tashkilotlar va ochiq kodli loyihalarda ishlab chiqarishda keng qoʻllanadi. 2016-yil noyabr oyida Go va Go Mono shriftlari tip dizaynerlari Charlz Bigelow va Kris Xolms tomonidan maxsus Go loyihasi tomonidan foydalanish uchun chiqarildi. Go - bu Lucida Grande -ga o'xshash gumanistik sans-serif, Go Mono esa monofazoda. Ikkala shrift ham WGL4 belgilar to'plamiga mos keladi va katta x-balandligi va aniq harf shakllari bilan o'qilishi uchun mo'ljallangan. Go va Go Mono ikkalasi ham DIN 1450 standartiga mos keladi, ular qirrali nol, dumli kichik codice_2 va serifli katta codice_3 harfiga ega. 2018-yilning aprel oyida asl logotip oʻrniga egilgan oʻng tomonga stilize qilingan GO oʻng tomondagi chiziqlar qoʻyilgan. (Gofer talismasi oʻzgarishsiz qoldi.) Umumiy. Go-ning dastlabki versiyalarida umumiy dasturlashni qo'llab-quvvatlamasligi jiddiy tanqidlarga sabab bo'ldi. Dizaynerlar umumiy dasturlashga ochiqlik bildirishdi va o'rnatilgan funksiyalar "aslida" umumiy tip ekanligini, lekin ular alohida holatlar sifatida ko'rib chiqilishini ta'kidladilar; Pike buni bir nuqtada o'zgartirilishi mumkin bo'lgan zaiflik deb atadi. Google jamoasi generiklar bilan eksperimental Go dialekti uchun kamida bitta kompilyator yaratdi, lekin uni chiqarmadi. 2018-yil avgust oyida Go asosiy ishtirokchilari umumiy dasturlash va xatolarni hal qilish uchun loyiha loyihalarini nashr etishdi va foydalanuvchilardan fikr-mulohazalarini yuborishni soʻrashdi. Biroq, xatolarni ko'rib chiqish taklifi oxir-oqibat bekor qilindi. 2020-yil iyun oyida umumiy funksiyalar va turlarni e’lon qilish uchun Go-ga kerakli sintaksisni qoʻshadigan yangi dizayn hujjati loyihasi chop etildi. Kodni tarjima qilish vositasi," ", foydalanuvchilarga yangi sintaksisni, shuningdek, onlayn Go Playground-ning generics-yoqilgan versiyasini sinab ko'rish imkonini berish uchun taqdim etilgan. Versiyalar. Go 1 standart kutubxonaning til spetsifikatsiyasi va asosiy qismlari uchun muvofiqligini kafolatlaydi. Joriy Go 1.18 versiyasigacha bo'lgan barcha versiyalar bu va'dani saqlab qoldi. Har bir yirik Go versiyasi ikkita yangi asosiy relizlar paydo bo'lguncha qo'llab-quvvatlanadi. Dizayn. Go ga C (ayniqsa, Plan 9 dialekti) ta'sir qiladi, lekin ko'proq soddalik va xavfsizlikka urg'u beriladi. U quyidagilardan iborat: Sintaksis. Go sintaksisi C dan kodni qisqa va o'qilishi mumkin bo'lgan o'zgarishlarni o'z ichiga oladi. Dasturchiga codice_10 ni yozish imkonini beruvchi birlashtirilgan deklaratsiya/insializatsiya operatori joriy etildi codice_10 yoki codice_12, ishlatiladigan o'zgaruvchilar turlarini ko'rsatmasdan. Bu C ning codice_13 va codice_14 codice_15. Nuqtali vergul hali ham bayonotlarni tugatadi; , lekin chiziq oxiri kelganda yashirin bo'ladi. Usullar bir nechta qiymatlarni qaytarishi mumkin va codice_16 pair usuli Go'da qo'ng'iroq qiluvchiga xatoni ko'rsatadigan an'anaviy usuldir. Go tuzilma parametrlarini nom boʻyicha ishga tushirish hamda xaritalar va boʻlaklarni ishga tushirish uchun soʻzma-soʻz sintaksislarni qoʻshadi. C ning uchli codice_17 loop iborasiga muqobil sifatida Go codice_18 ifodalar massivlar, bo'limlar, satrlar, xaritalar va kanallar ustidan qisqacha takrorlash imkonini beradi. Turlari. Go-da bir qator o'rnatilgan turlar mavjud, jumladan raqamli (, , va boshqalar), mantiqiy va belgilar satrlari ( ). Satrlar o'zgarmasdir; o'rnatilgan operatorlar va kalit so'zlar (funksiyalar o'rniga) birlashtirish, taqqoslash va UTF-8 kodlash/dekodlashni ta'minlaydi. Yozuv turlari bilan belgilanishi mumkin kalit so'zi. Har bir tur uchun va har bir manfiy bo'lmagan butun son doimiysi, belgilangan massiv turi mavjud ; turli uzunlikdagi massivlar shuning uchun har xil turdagi. Dinamik massivlar "bo'laklar" shaklida mavjud. Ular massivni kengaytirish uchun qachon yangi xotira ajratish kerakligini ko'rsatadigan uzunlik va "sig'imga ega". Bir nechta bo'laklar o'zlarining asosiy xotiralarini baham ko'rishlari mumkin. Ko'rsatkichlar barcha turlar uchun mavjud va ko'rsatgich - turi belgilangan. Manzil olish va bilvosita foydalanish va operatorlar, C da bo'lgani kabi, yoki usul chaqiruvi yoki atributga kirish sintaksisi orqali bilvosita sodir bo'ladi. Hech qanday ko'rsatkich arifmetikasi yo'q, [lower-alpha 5] maxsus orqali tashqari Standart kutubxonadagi ko'rsatkich turi. Bir juft tur uchun, , turi - xesh-jadvallarni xaritalash turi- Yozish uchun tugmalari - qiymatlari. Xesh-jadvallar maxsus sintaksis va o'rnatilgan funksiyalar bilan tilga kiritilgan. - bir vaqtning o'zida Go jarayonlari o'rtasida "T" tipidagi qiymatlarni yuborish imkonini beruvchi "kanal". Interfeyslarni qo'llab-quvvatlashdan tashqari, Go tipidagi tizim nominaldir : the kalit so'zi bir xil tuzilishga ega bo'lgan boshqa nomli turlardan farq qiladigan yangi "nomlangan turni" aniqlash uchun ishlatilishi mumkin (agar bo'lsa, bir xil a'zolar bir xil tartibda). Turlar orasidagi ba'zi konvertatsiyalar (masalan, turli xil tamsayılar turlari o'rtasida) oldindan belgilangan va yangi turni qo'shish qo'shimcha konversiyalarni belgilashi mumkin, ammo nomlangan turlar orasidagi konvertatsiya har doim aniq chaqirilishi kerak. Masalan, kalit so'zidan 32-bitli belgisiz butun sonlarga asoslangan IPv4 manzillari turini aniqlash uchun foydalanish mumkin: type ipv4addr uint32 Ushbu turdagi ta'rif bilan, ni izohlaydi qiymati IP manzil sifatida. Shunchaki tayinlash turidagi o'zgaruvchiga - bu turdagi xato. Doimiy iboralar terilgan yoki "tiplanmagan" bo'lishi mumkin; Agar ular ifodalagan qiymat kompilyatsiya vaqti tekshiruvidan o'tsa, ular tiplangan o'zgaruvchiga tayinlanganda tur beriladi. Funksiya turlari bilan ko'rsatilgan kalit so'zi; ular nol yoki undan ko'p parametrlarni oladi va nol yoki undan ko'p qiymatlarni qaytaradi, ularning barchasi yoziladi. Parametr va qaytish qiymatlari funksiya turini aniqlaydi; shunday qilib, - a oladigan funksiyalar turi va 32-bitli imzolangan tamsayı va imzolangan butun sonni (standart kenglikdagi) va o'rnatilgan interfeys turi qiymatini qaytaring. Har qanday nomlangan turda u bilan bog'langan usullar to'plami mavjud. Yuqoridagi IP-manzil misoli uning qiymati ma'lum standart ekanligini tekshirish usuli bilan kengaytirilishi mumkin: // ZeroBroadcast reports whether addr is 255.255.255.255. func (addr ipv4addr) ZeroBroadcast() bool { return addr == 0xFFFFFFFF Nominal tiplash tufayli ushbu usul ta'rifi usulni qo'shadi, lekin yoqilmagan. Usullar maxsus ta'rif va chaqiruv sintaksisiga ega bo'lsa-da, aniq usul turi mavjud emas. Interfeys tizimi. Go sinf merosini almashtiradigan ikkita xususiyatni taqdim etadi. Birinchisi, kompozitsiyaning avtomatlashtirilgan shakli sifatida ko'rib chiqilishi mumkin bo'lgan "joylashtirishdir". Ikkinchisi uning "interfeyslari" bo'lib, ish vaqti polimorfizmini ta'minlaydi. Interfeyslar turlar sinfidir va Go ning boshqa nominal turdagi tizimida strukturaviy yozishning cheklangan shaklini ta'minlaydi. Interfeys tipidagi obyekt ham C++ obyektlari bir vaqtning o'zida asosiy va hosila sinfiga o'xshab boshqa turdagidir. Go interfeyslari Smalltalk dasturlash tilidagi protokollardan keyin ishlab chiqilgan. Bir nechta manbalar Go interfeyslarini tavsiflashda o'rdak yozish atamasidan foydalanadi. O'rdak terish atamasi aniq ta'riflanmagan va shuning uchun noto'g'ri bo'lmasa-da, bu odatda turga muvofiqligi statik ravishda tekshirilmaganligini anglatadi. Go interfeysiga muvofiqlik Go kompilyatori tomonidan statik tarzda tekshirilganligi sababli (turni tasdiqlashdan tashqari), Go mualliflari "tizimli yozish" atamasini afzal ko'radilar. Interfeys turining ta'rifi talab qilinadigan usullarning nomi va turi bo'yicha ro'yxatini beradi. I turdagi interfeysning barcha talab qilinadigan usullariga mos keladigan funksiyalari mavjud bo'lgan T tipidagi har qanday obyekt ham I turdagi obyekt hisoblanadi. T turining ta'rifi I turni aniqlashi shart emas (va mumkin emas). Masalan, agar, quyidagicha aniqlanadi import "math" type Shape interface { Area() float64 type Square struct { // Note: no "implements" declaration side float64 type Circle struct { // No "implements" declaration here either radius float64 Interfeyslar orqali usullarni chaqirishdan tashqari, Go interfeys qiymatlarini ish vaqti turini tekshirish bilan boshqa turlarga aylantirish imkonini beradi. Buni amalga oshirish uchun til konstruksiyalari bitta potentsial turga qarshi tekshiradigan "tur tasdiqi" va bir nechta turga qarshi tekshiradigan "turdagi switch" hisoblanadi. "Bo'sh interfeys" codice_19 muhim asosiy holatdir, chunki u "har qanday" aniq turdagi elementga murojaat qilishi mumkin. ga o'xshaydi Java yoki C# sinfi va har qanday turdagi, jumladan, o'rnatilgan turlar bilan mos keladi . Bo'sh interfeysdan foydalanadigan kod havola qilinayotgan obyektdagi usullarni (yoki o'rnatilgan operatorlarni) oddiygina chaqira olmaydi, lekin u codice_19 qiymatini saqlashi, uni turni tasdiqlash yoki turni almashtirish orqali foydaliroq turga aylantirishga harakat qilishi mumkin, yoki uni Go'ning codice_21 paketi bilan tekshiring. codice_19 har qanday qiymatga murojaat qilishi mumkinligi sababli, bu C dagi codice_23 kabi statik yozish cheklovlaridan qochishning cheklangan usuli, lekin qo'shimcha ish vaqti turini tekshirish bilan. codice_19 turidan JSON yoki YAML maʼlumotlari kabi Goʼdagi har qanday ixtiyoriy sxemaning tuzilgan maʼlumotlarini codice_25 (qatordan boʻsh interfeysga xaritasi) sifatida koʻrsatish orqali modellashtirish uchun foydalanish mumkin. Bu lug'at ko'rinishidagi ma'lumotlarni string kalitlari va istalgan turdagi qiymatlari bilan rekursiv tarzda tavsiflaydi. Interfeys qiymatlari ma'lumotlarga ko'rsatgich va ish vaqti turi ma'lumotlariga ikkinchi ko'rsatgich yordamida amalga oshiriladi. Go'da ko'rsatgichlar yordamida amalga oshiriladigan ba'zi boshqa turlar singari, agar ishga tushirilmagan bo'lsa, interfeys qiymatlari codice_26. Parametrlashtirilgan turlardan foydalangan holda umumiy kod. 1.18 versiyasidan boshlab, Go parametrlashtirilgan turlardan foydalangan holda umumiy kodni qo'llab-quvvatlaydi. Package system. Go paketlar tizimida har bir paketning yo'li (masalan, codice_27 yoki codice_28) va nomi (masalan, codice_29 yoki codice_30) mavjud. Boshqa paketlarning ta'riflariga havolalar "har doim" boshqa paket nomi bilan birga bo'lishi kerak va faqat boshqa paketlardagi bosh "harflar" bilan yozilgan nomlarga kirish mumkin: codice_31 codice_32 ochiq, lekin codice_33 emas. codice_8 buyrug'i masofaviy omborda saqlangan paketlarni olishi mumkin va ishlab chiquvchilarga nomlar bilan to'qnashuv ehtimolini kamaytirish uchun manba omboriga (masalan, example.com/user_name/package_name) mos keladigan asosiy yo'l ichida paketlarni ishlab chiqish tavsiya etiladi. standart kutubxonaga yoki boshqa tashqi kutubxonalarga kelajakdagi qo'shimchalar. Parametrlar: gorutinlar va kanallar. Go tilida bir vaqtning o'zida dasturlarni yozish uchun o'rnatilgan imkoniyatlar, shuningdek kutubxona yordami mavjud. Parallellik nafaqat protsessor parallelizmini, balki asinxronlikni ham anglatadi: ma'lumotlar bazasi yoki tarmoqni o'qish kabi sekin operatsiyalarni dastur boshqa ishlarni bajarayotganda ishlashga ruxsat berish, hodisaga asoslangan serverlarda keng tarqalgan. Poyga holati xavfsizligining yo'qligi. Go'ning parallellikka bo'lgan yondashuvini "xotirani almashish orqali muloqot qilmang; muloqot orqali xotirani baham ko'ring" deb umumlashtirish mumkin. Goroutinlarning umumiy ma'lumotlarga kirishiga hech qanday cheklovlar yo'q, bu poyga sharoitlarini yaratishga imkon beradi. Xususan, agar dastur kanallar yoki boshqa vositalar orqali aniq sinxronizatsiya qilinmasa, bitta gorutindan olingan yozuvlar boshqasiga qisman, toʻliq yoki umuman koʻrinmasligi mumkin, koʻpincha yozish tartibiga kafolat berilmaydi. Bundan tashqari, interfeys qiymatlari, boʻlak sarlavhalari, xesh-jadvallar va satr sarlavhalari kabi Go-ning "ichki maʼlumotlar tuzilmalari" poyga sharoitlariga qarshi immunitetga ega emas, shuning uchun ushbu turdagi umumiy misollarni sinxronlashsiz oʻzgartiradigan koʻp oqimli dasturlarda tur va xotira xavfsizligi buzilishi mumkin. Tilni qo'llab-quvvatlash o'rniga, xavfsiz bir vaqtda dasturlash konventsiyalarga tayanadi; masalan, Chisnall " xor o'zgaruvchan taxalluslar" deb nomlangan idiomani tavsiya qiladi, ya'ni o'zgaruvchan qiymatni (yoki ko'rsatgichni) kanal orqali uzatish uning qabul qiluvchisiga qiymat ustidan egalik huquqini o'tkazishni bildiradi. Ikkilik. Gc asboblar zanjiridagi bog'lovchi sukut bo'yicha statik bog'langan ikkilik fayllarni yaratadi; shuning uchun barcha Go ikkiliklari Go ish vaqtini o'z ichiga oladi. Uslub. Go mualliflari Go dasturlari uslubiga ta'sir qilish uchun katta kuch sarfladilar: Asboblar. Asosiy Go taqsimoti kodni yaratish, sinovdan o'tkazish va tahlil qilish vositalarini o'z ichiga oladi: Misollar. Hello world. package main import "fmt" func main() { fmt.Println("Hello, world!") Bu yerda "fmt" C faylining kirish/chiqishiga o'xshash "formatlangan" kiritish/chiqarish paketidir. Quyidagi oddiy dastur asinxron dasturni amalga oshirish uchun Go'ning parallellik xususiyatlarini namoyish etadi. U ikkita engil ipni ("goroutines") ishga tushiradi: biri foydalanuvchi matnni yozishni kutadi, ikkinchisi esa vaqt tugashini amalga oshiradi. The iborasi ushbu gorutinlardan birortasining asosiy rejimga xabar yuborishini kutadi va birinchi kelgan xabarda harakat qiladi (misol Devid Chisnalning kitobidan moslangan). package main import ( "fmt" "time" func readword(ch chan string) { fmt.Println("Type a word, then hit Enter.") var word string fmt.Scanf("%s", &word) ch <- word func timeout(t chan bool) { time.Sleep(5 * time.Second) t <- false func main() { t := make(chan bool) go timeout(t) ch := make(chan string) go readword(ch) select { case word := <-ch: fmt.Println("Received", word) case <-t: fmt.Println("Timeout.") Ilovalar. Go-da yozilgan ba'zi mashhur ochiq manbali ilovalar quyidagilardan iborat: "Go nomli ko'plab hisoblash mahsulotlari va xizmatlari mavjud. Chiqarilganimizdan keyin 11 oy ichida ikki tilda minimal chalkashlik kuzatildi."