Go bu Google da Robert Griesemer, Rob Pike va Ken Tompson tomonidan ishlab chiqilgan statik tarzda terilgan, kompilyatsiya qilingan dasturlash tilidir.[7] U sintaktik jihatdan C ga o'xshaydi, lekin xotira xavfsizligi, axlat yig'ish, tizimli yozish, va CSP uslubidagi parallellik bilan.[8] Ilgari golang.org domen nomi tufayli u ko'pincha Golang deb ataladi, lekin uning to'g'ri nomi Go.[9]

  • Google'ning o'z-o'zini xostingi[10] "gc" kompilyator asboblar zanjiri, bir nechta operatsion tizimlarga va WebAssemblyga mo'ljallangan.[11]
  • gofrontend, libgo kutubxonasi bilan boshqa kompilyatorlar uchun frontend. GCC bilan kombinatsiya gccgo;[12] LLVM bilan kombinatsiya gollvm.[13] [lower-alpha 1]
Go
Go Logo Blue.svg
Paradigmalari Multi-paradigm: concurrent imperative, object-oriented[1][2]
Muallifi Robert Griesemer
Rob Pike
Ken Thompson
Tuzilgan yili 10-noyabr, 2009-yil (13 yil avval) (2009-11-10)
Operatsion tizim DragonFly BSD, FreeBSD, Linux, macOS, NetBSD, OpenBSD,[3] Plan 9,[4] Solaris, Windows
Litsenziya 3-clause BSD[5] + patent grant[6]
Vebsayt go.dev
Bunga asos boʻlgan tillar

Failed to render property influenced by: influenced by property not found.

Buning asosida tuzilgan tillar
Odin, Crystal, Zig

Uchinchi tomon manbadan manbaga kompilyator, GopherJS,[15] kompilyatsiya qiladi Front-end veb-ishlab chiqish uchun JavaScript -ga o'ting.

TarixTahrirlash

Go 2007-yilda Google'da ko'p yadroli, tarmoqli mashinalar va katta kod bazalari davrida dasturlash samaradorligini oshirish uchun ishlab chiqilgan.[16] Dizaynerlar Google -da qo'llaniladigan boshqa tillarning tanqidiga murojaat qilishni xohlashdi, lekin ularning foydali xususiyatlarini saqlab qolishdi:[17]

  • Statik yozish va ish vaqti samaradorligi (C kabi)
  • O'qish va foydalanish qulayligi (masalan, Python yoki JavaScript)[18]
  • Yuqori samarali tarmoq va multiprocessing

Uning dizaynerlari, birinchi navbatda , C++ tilini yoqtirmasliklari sabab bo'lgan.[19][20][21]

Go 2009-yil noyabr oyida ommaga e'lon qilindi[22] va 1.0 versiyasi 2012-yil mart oyida chiqarildi[23] Go Google va boshqa koʻplab tashkilotlar va ochiq kodli loyihalarda ishlab chiqarishda keng qoʻllaniladi.

 
Mascot of Go dasturlash tili yuqorida ko'rsatilgan Gopher.

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 l va serifli katta I harfiga ega.[24][25]

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.[26])

UmumiyTahrirlash

Go-ning dastlabki versiyalarida umumiy dasturlashni qo'llab-quvvatlamasligi jiddiy tanqidlarga sabab bo'ldi.[27] 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.[28] Google jamoasi generiklar bilan eksperimental Go dialekti uchun kamida bitta kompilyator yaratdi, lekin uni chiqarmadi.[29]

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.[30][31] Biroq, xatolarni ko'rib chiqish taklifi oxir-oqibat bekor qilindi.[32]

2020-yil iyun oyida umumiy funksiyalar va turlarni e’lon qilish uchun Go-ga kerakli sintaksisni qoʻshadigan yangi dizayn hujjati[33] 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.[34]

VersiyalarTahrirlash

Go 1 standart kutubxonaning til spetsifikatsiyasi va asosiy qismlari uchun[35] muvofiqligini kafolatlaydi. Joriy Go 1.18[36] 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.[37]

DizaynTahrirlash

Go ga C (ayniqsa, Plan 9 dialekti[38]) ta'sir qiladi, lekin ko'proq soddalik va xavfsizlikka urg'u beriladi. U quyidagilardan iborat:

  • Dinamik tillarda keng tarqalgan naqshlarni qabul qiluvchi sintaksis va muhit:[39]
- Ixtiyoriy qisqacha o'zgaruvchilar deklaratsiyasi va turdagi xulosalar orqali ishga tushirish (x := 0 int x = 0; x := 0 0; yoki var x = 0;)
– Tez kompilyatsiya
– Paketlarni masofadan boshqarish (go get)[40] va onlayn paket hujjatlari[41]
  • Muayyan muammolarga o'ziga xos yondashuvlar:
- O'rnatilgan parallellik ibtidoiylari: engil jarayonlar (gorutinlar), kanallar va select bayonoti
– Virtual meros oʻrniga interfeys tizimi va virtual boʻlmagan meros oʻrniga oʻrnatish turi
– Asboblar zanjiri, sukut boʻyicha, tashqi bogʻliqliklarsiz statik bogʻlangan mahalliy ikkilik fayllarni ishlab chiqaradi
  • Til spetsifikatsiyasini dasturchining boshida ushlab turadigan darajada sodda saqlash istagi,[42] qisman shunga o'xshash tillarda keng tarqalgan xususiyatlarni e'tiborsiz qoldirish orqali.

SintaksisTahrirlash

Go sintaksisi C dan kodni qisqa va o'qilishi mumkin bo'lgan o'zgarishlarni o'z ichiga oladi. Dasturchiga i := 3 ni yozish imkonini beruvchi birlashtirilgan deklaratsiya/insializatsiya operatori joriy etildi i := 3 yoki s := "Hello, world!", ishlatiladigan o'zgaruvchilar turlarini ko'rsatmasdan. Bu C ning int i = 3; va const char *s = "Hello, world!" ;. Nuqtali vergul hali ham bayonotlarni tugatadi; [lower-alpha 2], lekin chiziq oxiri kelganda yashirin bo'ladi. [lower-alpha 3] Usullar bir nechta qiymatlarni qaytarishi mumkin va result, err pair usuli Go'da qo'ng'iroq qiluvchiga xatoni ko'rsatadigan an'anaviy usuldir. [lower-alpha 4] 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 for loop iborasiga muqobil sifatida Go range ifodalar massivlar, bo'limlar, satrlar, xaritalar va kanallar ustidan qisqacha takrorlash imkonini beradi.[45]

TurlariTahrirlash

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 (funktsiyalar o'rniga) birlashtirish, taqqoslash va UTF-8 kodlash/dekodlashni ta'minlaydi.[46] Yozuv turlari bilan belgilanishi mumkin  kalit so'zi.[47]

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.[48][49]

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.[50][51] Hech qanday ko'rsatkich arifmetikasi yo'q, [lower-alpha 5] maxsus orqali tashqari  Standart kutubxonadagi ko'rsatkich turi.[52]

Bir juft tur uchun  , , turi  - xesh-jadvallarni xaritalash turi- Yozish uchun tugmalari -  qiymatlari. Xesh-jadvallar maxsus sintaksis va o'rnatilgan funktsiyalar bilan tilga kiritilgan.  - bir vaqtning o'zida Go jarayonlari o'rtasida T tipidagi qiymatlarni yuborish imkonini beruvchi kanal.[53]

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.[54] 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.[55]

Funktsiya 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 .[56]

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.[57]

Interfeys tizimiTahrirlash

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.[58] :266Interfeyslar turlar sinfidir va Go ning boshqa nominal turdagi tizimida strukturaviy yozishning cheklangan shaklini ta'minlaydi. Interfeys tipidagi ob'ekt ham C++ ob'ektlari bir vaqtning o'zida asosiy va hosila sinfiga o'xshab boshqa turdagidir. Go interfeyslari Smalltalk dasturlash tilidagi protokollardan keyin ishlab chiqilgan.[59] Bir nechta manbalar Go interfeyslarini tavsiflashda o'rdak yozish atamasidan foydalanadi.[60][61] 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.[62]

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 ob'ekt ham I turdagi ob'ekt 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
}

func (sq Square) Area() float64 { return sq.side * sq.side }

type Circle struct { // No "implements" declaration here either
    radius float64
}

func (c Circle) Area() float64 { return math.Pi * math.Pow(c.radius, 2) }


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[63] va bir nechta turga qarshi tekshiradigan turdagi switch[64] hisoblanadi. 

Bo'sh interfeys interface{} 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 . :284Bo'sh interfeysdan foydalanadigan kod havola qilinayotgan ob'ektdagi usullarni (yoki o'rnatilgan operatorlarni) oddiygina chaqira olmaydi, lekin u interface{} qiymatini saqlashi, uni turni tasdiqlash yoki turni almashtirish orqali foydaliroq turga aylantirishga harakat qilishi mumkin, yoki uni Go'ning reflect paketi bilan tekshiring.[65] interface{} har qanday qiymatga murojaat qilishi mumkinligi sababli, bu C dagi void* kabi statik yozish cheklovlaridan qochishning cheklangan usuli, lekin qo'shimcha ish vaqti turini tekshirish bilan. 

interface{} turidan JSON yoki YAML maʼlumotlari kabi Goʼdagi har qanday ixtiyoriy sxemaning tuzilgan maʼlumotlarini map[string]interface{} (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.[66]

Interfeys qiymatlari ma'lumotlarga ko'rsatgich va ish vaqti turi ma'lumotlariga ikkinchi ko'rsatgich yordamida amalga oshiriladi.[67] Go'da ko'rsatgichlar yordamida amalga oshiriladigan ba'zi boshqa turlar singari, agar ishga tushirilmagan bo'lsa, interfeys qiymatlari nil.[68]

Parametrlashtirilgan turlardan foydalangan holda umumiy kodTahrirlash

1.18 versiyasidan boshlab, Go parametrlashtirilgan turlardan foydalangan holda umumiy kodni qo'llab-quvvatlaydi.[69]

Package systemTahrirlash

Go paketlar tizimida har bir paketning yo'li (masalan, "compress/bzip2" yoki "golang.org/x/net/html") va nomi (masalan, bzip2 yoki html) 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: io. Reader ochiq, lekin bzip2.reader emas.[70] go get buyrug'i masofaviy omborda saqlangan paketlarni olishi mumkin[71] 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.[72]

Parametrlar: gorutinlar va kanallarTahrirlash

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.[73]

Poyga holati xavfsizligining yo'qligiTahrirlash

Go'ning parallellikka bo'lgan yondashuvini "xotirani almashish orqali muloqot qilmang; muloqot orqali xotirani baham ko'ring" deb umumlashtirish mumkin.[74] 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.[75] 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.[76][77] 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. [78] :155

IkkilikTahrirlash

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.[79][80]

UslubTahrirlash

Go mualliflari Go dasturlari uslubiga ta'sir qilish uchun katta kuch sarfladilar:

  • Chiziq, bo'shliq va kodning boshqa sirt darajasidagi tafsilotlari gofmt vositasi tomonidan avtomatik ravishda standartlashtiriladi. Unda chekinish uchun yorliqlar va tekislash uchun blanklardan foydalaniladi. Hizalama muharrir qattiq kenglikdagi shriftdan foydalanayotganini taxmin qiladi.[81] golint avtomatik tarzda qoʻshimcha uslub tekshiruvlarini amalga oshiradi, biroq Go boshqaruvchilari tomonidan eskirgan va arxivlangan.[82]
  • Go bilan tarqatilgan asboblar va kutubxonalar API hujjatlari (godoc),[83] test (go test), qurish (go build), paketlarni boshqarish (go get) va boshqalar kabi narsalarga standart yondashuvlarni taklif qiladi.
  • Go boshqa tillardagi tavsiyalar boʻlgan qoidalarni amalga oshiradi, masalan, tsiklik bogʻliqliklarni, foydalanilmagan oʻzgaruvchilarni[84] yoki importni[85] va yashirin turdagi konvertatsiyalarni taqiqlash.
  • Muayyan funksiyalarning (masalan, map va Java uslubidagi try / finally bloklari kabi funktsional-dasturlash yorliqlari) oʻtkazib yuborilishi maʼlum bir aniq, aniq va imperativ dasturlash uslubini ragʻbatlantiradi.
  • Birinchi kuni Go jamoasi Go idiomalari toʻplamini nashr etdi[83] va keyinchalik Go uslubi va kodlash falsafasini oʻrgatish uchun kodni koʻrib chiqish sharhlari,[86] suhbatlar[87] va rasmiy blog postlarini[88] toʻpladi.

AsboblarTahrirlash

Asosiy Go taqsimoti kodni yaratish, sinovdan o'tkazish va tahlil qilish vositalarini o'z ichiga oladi:

  • go build, bu Go ikkilik fayllarini faqat manba fayllaridagi ma'lumotlardan foydalangan holda tuzadi, alohida makefayllar yo'q
  • birlik sinovi va mikrobenchmarklar uchun go test
  • Kodni formatlash uchun go fmt
  • masofaviy paketlarni olish va o'rnatish uchun go install
  • go vet, koddagi mumkin bo'lgan xatolarni qidiradigan statik analizator
  • go run, kodni yaratish va bajarish uchun yorliq
  • godoc, hujjatlarni ko'rsatish yoki HTTP orqali xizmat ko'rsatish uchun
  • gorename, o'zgaruvchilar, funksiyalar va hokazolarni turdagi xavfsiz tarzda qayta nomlash uchun
  • go generate, kod generatorlarini chaqirishning standart usuli
  • go mod, yangi modul yaratish, bog'liqliklarni qo'shish, bog'liqliklarni yangilash va hk.

MisollarTahrirlash

Hello worldTahrirlash

package main

import "fmt"

func main() {
    fmt.Println("Hello, world!")
}

Bu erda "fmt" C faylining kirish/chiqishiga o'xshash formatlangan kiritish/chiqarish paketidir.[89] 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).[78] :152

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.")
  }
}

IlovalarTahrirlash

Go-da yozilgan ba'zi mashhur ochiq manbali ilovalar quyidagilardan iborat:[90]

  • Caddy, avtomatik HTTPS imkoniyatiga ega ochiq kodli HTTP/2 veb-server
  • CockroachDB, ochiq manba, omon qolish mumkin, kuchli izchil, kengaytirilgan SQL ma'lumotlar bazasi
  • Konsul, DNS-ga asoslangan xizmatlarni topish va taqsimlangan kalit-qiymatni saqlash, segmentatsiya va konfiguratsiyani ta'minlaydigan dasturiy ta'minot.
  • Docker, Linux konteynerlarini joylashtirish uchun vositalar to'plami
  • EdgeX, Linux Foundation tomonidan joylashtirilgan sotuvchi uchun neytral ochiq manba platformasi, sanoat IoT chekka hisoblashlari uchun umumiy asosni ta'minlaydi[91]
  • Hugo, statik sayt generatori
  • InfluxDB, yuqori mavjudlik va yuqori ishlash talablari bilan vaqt seriyalari ma'lumotlarini qayta ishlash uchun maxsus ochiq manba ma'lumotlar bazasi
  • InterPlanetary File System, kontent manzilli, peer-to-peer gipermedia protokoli[92]
  • Juju, Canonical tomonidan xizmat ko'rsatishni boshqarish vositasi, Ubuntu Linux paketchilari
  • Kubernetes konteynerlarni boshqarish tizimi
  • lnd, Bitcoin Lightning Network ilovasi[93]
  • Eng muhimi, jamoaviy suhbat tizimi
  • NATS Messaging, ishlash, kengayish va foydalanish qulayligining asosiy dizayn tamoyillarini o'z ichiga olgan ochiq manbali xabar almashish tizimi[94]
  • OpenShift, Red Hat tomonidan xizmat sifatida bulutli hisoblash platformasi
  • Rclone, bulutli saqlash va boshqa yuqori kechikish xizmatlaridagi fayllarni boshqarish uchun buyruq qatori dasturi
  • Snappy, Canonical tomonidan ishlab chiqilgan Ubuntu Touch uchun paket menejeri
  • Sinxronizatsiya, ochiq manbali fayl sinxronizatsiyasi mijoz/server ilovasi
  • Terraform, HashiCorp kompaniyasining ochiq manbali, bir nechta bulutli infratuzilmani ta'minlash vositasi
  • TiDB, PingCAP-dan MySQL protokoli bilan mos keladigan ochiq manbali, taqsimlangan HTAP ma'lumotlar bazasi
  • arctil, Veb xavfsizligini baholash vositasi[95]
  • Cacoo, Go va gRPC yordamida foydalanuvchi boshqaruv paneli sahifasini va mikroservisni ko'rsatishi uchun
  • Chango, dasturiy reklama kompaniyasi Go'ni real vaqt rejimida taklif qilish tizimlarida ishlatadi[96]
  • Cloud Foundry, xizmat sifatidagi platforma[97]
  • Cloudflare, ularning delta-kodlovchi proksi-serverlari uchun Railgun, tarqatilgan DNS xizmati, shuningdek kriptografiya, jurnallar, oqimlarni qayta ishlash va SPDY saytlariga kirish uchun vositalar[98][99]
  • Container Linux (sobiq CoreOS), Docker konteynerlari[100] va rkt konteynerlaridan foydalanadigan Linuxga asoslangan operatsion tizim
  • Couchbase serveridagi Couchbase, so'rovlar va indekslash xizmatlari[101]
  • Ba'zi muhim komponentlarini Python'dan Go'ga ko'chirgan Dropbox[102]
  • Ethereum, Ether kriptovalyutasi uchun Ethereum Virtual Machine blokcheynining go-ethereum amalga oshirilishi[103]
  • Gitlab, Git - ombor, wiki, muammolarni kuzatish, uzluksiz integratsiya, tarqatish quvurlari xususiyatlarini ta'minlovchi veb-asoslangan DevOps hayot aylanish vositasi[104]
  • Google, ko'plab loyihalar uchun, xususan dl.google.com yuklab olish serveri[105][106][107]
  • Heroku, Doozer uchun, qulflash xizmati [8]
  • Hyperledger Fabric, ochiq manbali, korxonaga yo'naltirilgan taqsimlangan kitob loyihasi
  • MongoDB, MongoDB nusxalarini boshqarish vositalari[108]
  • Netflix, ularning server arxitekturasining ikki qismi uchun[109]
  • Nutanix, Enterprise Cloud OS-da turli xil mikro xizmatlar uchun[110]
  • Plug.dj, interaktiv onlayn ijtimoiy musiqa oqimli veb-sayt[111]
  • SendGrid, Boulder, Koloradoda joylashgan tranzaksiya elektron pochta xabarlarini yetkazib berish va boshqarish xizmati.[112]
  • SoundCloud, "o'nlab tizimlar" uchun[113]
  • Splice, ularning onlayn musiqa hamkorlik platformasining butun backend (API va tahlilchilar) uchun[114]
  • ThoughtWorks, uzluksiz yetkazib berish va tezkor xabarlar uchun ba'zi vositalar va ilovalar (CoyIM)[115]
  • Twitch, ularning IRC-ga asoslangan chat tizimi uchun (Python-dan ko'chirilgan)[116]
  • Uber, geografik chegaraga asoslangan katta hajmdagi so'rovlarni ko'rib chiqish uchun[117]

"Go nomli ko'plab hisoblash mahsulotlari va xizmatlari mavjud. Chiqarilganimizdan keyin 11 oy ichida ikki tilda minimal chalkashlik kuzatildi."[118]

TanqidTahrirlash

  • Go's nol algebraik turlarning yo'qligi bilan birgalikda nosozliklar va asosiy holatlar bilan ishlashda qiyinchiliklarga olib keladi.[119][120]
  • Go ochiladigan qavsning o'z satrida paydo bo'lishiga ruxsat bermaydi, bu esa barcha Go dasturchilarni bir xil qavs uslubidan foydalanishga majbur qiladi.[121]
  • Go standart kutubxonasidagi fayl semantikasi asosan POSIX semantikasiga asoslangan va ular Windows platformasiga yaxshi mos kelmaydi.[122][123] E'tibor bering, bu muammo Go'ga xos emas, lekin boshqa dasturlash tillari buni yaxshi belgilangan standart kutubxonalar orqali hal qilgan.
  • Tadqiqot shuni ko'rsatdiki, umumiy xotirada bo'lgani kabi, xabarlarni uzatishda ham bir vaqtning o'zida xatolarni yaratish oson, ba'zan undan ham ko'proq.[124]

Andoza:Google FOSS

  1. „Is Go an object-oriented language?“. — „Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy.“. Qaraldi: 13-aprel 2019-yil.
  2. „Go: code that grows with grace“. — „Go is Object Oriented, but not in the usual way.“. Qaraldi: 24-iyun 2018-yil.
  3. „lang/go: go-1.4 – Go programming language“. OpenBSD ports (23-dekabr 2014-yil). Qaraldi: 19-yanvar 2015-yil.
  4. „Go Porting Efforts“. Go Language Resources. cat-v (12-yanvar 2010-yil). Qaraldi: 18-yanvar 2010-yil.
  5. „Text file LICENSE“. The Go Programming Language. Qaraldi: 5-oktabr 2012-yil.
  6. „Additional IP Rights Grant“. The Go Programming Language. Qaraldi: 5-oktabr 2012-yil.
  7. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  8. 8,0 8,1 {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  9. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  10. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  11. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  12. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  13. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  14. „gollvm § Is gollvm a replacement for the main Go compiler? (gc)“. Git at Google.
  15. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  16. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  17. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  18. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  19. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  20. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  21. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  22. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  23. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  24. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  25. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  26. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  27. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  28. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  29. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  30. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  31. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  32. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  33. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  34. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  35. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  36. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  37. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  38. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  39. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  40. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  41. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  42. „arxiv nusxasi“. 20-oktabr 2013-yilda asl nusxadan arxivlandi. Qaraldi: 18-may 2022-yil.
  43. „Go Programming Language Specification, §Semicolons“. golang.org.
  44. „Effective Go, §Semicolons“. golang.org.
  45. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  46. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  47. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  48. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  49. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  50. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  51. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  52. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  53. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  54. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  55. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  56. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  57. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  58. Balbaert, Ivo. The Way to Go: A Thorough Introduction to the Go Programming Language. iUniverse, 2012. 
  59. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  60. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  61. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  62. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  63. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  64. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  65. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  66. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  67. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  68. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  69. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  70. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  71. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  72. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  73. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  74. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  75. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  76. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  77. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  78. 78,0 78,1 Chisnall, David. The Go Programming Language Phrasebook. Addison-Wesley, 2012. ISBN 9780132919005. 
  79. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  80. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  81. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  82. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  83. 83,0 83,1 {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  84. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  85. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  86. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  87. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  88. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  89. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  90. avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software, https://github.com/avelino/awesome-go, qaraldi: 10-yanvar 2018-yil Go (dasturlash tili)]]
  91. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  92. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  93. "lightningnetwork/lnd", GitHub, https://github.com/lightningnetwork/lnd, qaraldi: 29-aprel 2020-yil Go (dasturlash tili)]]
  94. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  95. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  96. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  97. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  98. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  99. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  100. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  101. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  102. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  103. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  104. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  105. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  106. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  107. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  108. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  109. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  110. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  111. „arxiv nusxasi“. 11-iyun 2015-yilda asl nusxadan arxivlandi. Qaraldi: 18-may 2022-yil.
  112. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  113. „arxiv nusxasi“. 11-noyabr 2013-yilda asl nusxadan arxivlandi. Qaraldi: 18-may 2022-yil.
  114. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  115. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  116. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  117. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  118. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  119. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  120. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  121. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  122. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  123. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.
  124. {{Veb manbasi}} andozasidan foydalanishda sarlavha= parametrini belgilashingiz kerak. „{{{title}}}“.


Manba xatosi: <ref> tags exist for a group named "lower-alpha", but no corresponding <references group="lower-alpha"/> tag was found