Go (programmalastırıw tili)

Go - kompilyaciyalanǵan joqarı dárejeli programmalastırıw tili. Go tili Google-da[1] Robert Grizemer, Rob Payk hám Ken Tompson tárepinen islep shıǵarılǵan statikalıq jazılǵan programmalastırıw tili.[2] Ol sintaksislik jaǵınan C tiline uqsas, biraq sonıń menen birge yad qáwipsizligi, shıǵındını jıynaw, strukturalıq jazıw hám CSP stilindegi parallellikke iye.[3] Aldın domen atı golang.org bolǵanlıqtan onı jiyi Golang dep te ataydı, biraq onıń anıq atı Go.[4]

Eki tiykarǵı ámelge asırıw bar:

  • Bir neshe operacion sistemalarǵa hám WebAssembly-ge baǵdarlanǵan Google-dıń ózine tán "gc" kompilyatorlıq úskeneler dizbegine iye.[5][6]
  • gofrontend, libgo kitapxanası bar basqa kompilyatorlarǵa arnalǵan frontend. GCC kombinaciyası;[7] LLVM-menen kombinaciya - gollvm.[8]

Úshinshi táreptiń derekten derekke kompilyatorı, GopherJS,[9] veb-sayttı jaratıw ushın Go to JavaScript kompilyaciya etedi.

Go 2007 jılı Google-da kóp yadrolı, tarmaqlıq mashinalar menen úlken kodlıq bazalar dáwirinde programmalastırıw ónimliligin arttırıw ushın jaratılǵan.[10] Dizaynerler Google-da qollanılatuǵın basqa tillerge baylanıslı sınlardı qarastırǵısı keldi, biraq olardıń paydalı ózgesheliklerin saqladı:[11]

  • Statikalıq jazıw hám jumıs waqtınıń ónimliligi (C sıyaqlı)
  • Oqıw hám paydalanıw ushın qolaylı (Python sıyaqlı)[12]
  • Joqarı ónimli tarmaq hám multiprocessing

Onıń dizaynerlerine, birinshi gezekte C++ tilin unatpawı sebep boldı.[13][14][15]

Go 2009 jıl noyabrde kópshilikke járiyalandı,[16] al 1.0 versiyası 2012 jıl martta shıǵarıldı.[17] Go Google-da hám kóplegen basqa shólkemlerde, ashıq kodlı proektlerde óndiriste keńnen qollanıladı.

Brending hám stillew

redaktorlaw
 
Mascot of Go programmalastırıw tili joqarıda kórsetilgen Gopher bolıp tabıladı.

Gopher tumarı 2009 jılı tildiń ashıq kodın iske túsiriw ushın engizilgen. Dizayn, Rene Francuz, 2000 WFMU reklaması.[18]

2016 jıl noyabrde Go hám Go Mono háriplerin tipli dizaynerler Charlz Bigelou hám Kris Xolms Go proekti ushın arnawlı túrde shıǵardı. Go - Lyusida Grandege uqsaytuǵın gumanistik san-serif, al Go Mono - bir keńislik. Eki háripte WGL4 belgiler toplamına sáykes keledi hám úlken x biyikligi menen hám ayqın háriplik formalar menen oqıwǵa bolatuǵınday etip islengen.[19][20]

2018 jıl aprelde original logotipti brend dizayner Adam Smit qayta isledi. Jańa logotip - bul zamanagóy, stillendirilgen GO jazıwına iye.[21]

Go baǵdarlamasınıń dáslepki versiyalarında programmalastırıwdı qollawdıń joqlıǵı aytarlıqtay sınǵa ushıradı.[22] Dizaynerler ulıwma programmalastırıwǵa ashıqlıǵın bildirdi hám ornatılǵan funkciyalar shın mánisinde ulıwma tipli, biraq ózgeshe jaǵdaylar retinde qarastırılatuǵının atap ótti; Payk bunı bir noqatta ózgeriwi múmkin hálsizlik dep atadı.[23] Google toparı djenerikleri eksperimentlik Go dialekti ushın kem degende bir kompilyator jarattı, biraq onı shıǵarmadı.[24]

2018 jıl avgustte Go tiykarǵı qatnasıwshıları ulıwma programmalastırıw hám qátelerdi qayta islewge arnalǵan joba proektlerin járiyaladı hám paydalanıwshılardan keri baylanıs jiberiwdi soradı.[25][26] Degen menen, qátelerdi qayta islew usınısı aqırında biykar etildi.[27]

2020 jıl iyunda ulıwma funkciyalar menen tiplerdi járiyalaw ushın Go xızmetine kerekli sintaksisti qosatuǵın jańa jobalıq hújjet[28] proekti járiyalandı. Paydalanıwshılarǵa jańa sintaksisti qollanıp kóriwge imkaniyat beretuǵın kodtı awdarıw quralı hám onlayn Go Playground baǵdarlamasınıń djeneriklerge qosılǵan versiyası menen támiyinlendi.[29]

2022 jıl 15-martta 1.18 versiyasında djenerikler Go xızmetine qosıldı.[30]

Versiyalaw

redaktorlaw

Go 1 standart kitapxananıń til ózgesheligi menen[31] tiykarǵı bólimleri ushın úylesimlilikke kepillik beredi. Aǵımdaǵı Go 1.22 shıǵarılımına[32] shekemgi barlıq versiyalar bul wádeni orınladı.

Go SemVer-di iyelemeydi; kerisinshe hárbir Go shıǵarılımına eki jańa shıǵarılım bolǵansha qollap-quwatlanadı. Kóplegen programmalıq quraldan ayırmashılıǵı, Go tiykarǵı versiyadaǵı ekinshi nomerdi ataydı, yaǵnıy 1.x x-te tiykarǵı versiya. [33] Bul úylesimlilik tildiń tiykarǵı sawda noqatlarınıń biri ekenin esapqa alsaq, Go heshqashan 2.0 dárejesine jetiwdi rejelestirip atırǵan joq.[34]

Proektlestiriw

redaktorlaw

Go-ǵa C (ásirese joba 9 dialekti) tásir etedi,[35] biraq úlkenirek ápiwayılıq penen qáwipsizlikke ayrıqsha itibar qaratadı. Ol tómendegilerden ibarat:

  • Dinamikalıq tillerde jiyi ushırasatuǵın úlgilerdi qabıllatuǵın sintaksis hám ortalıq:[36]
    • Qosımsha qısqasha ózgeriwshilerdi járiyalaw hám inicializaciya tip arqalı juwmaǵı (var x int = 0 ornına x := 0; yamasa var x = 0;)
    • Tez kompilyaciya
    • Paketti aralıqtan basqarıw (go get)[37] hám onlayn paket hújjetleri[38]
  • Belgili bir máselelerge ózgeshe usıllar:
    • Ornatılǵan parallel primitivleri: jeńil procesler (gorutinler), kanallar hám select operatorı.
    • Virtual miyrastıń ornına interfeys sisteması hám virtual emes miyrastıń ornına kirgiziw tipi.
    • Ádepki boyınsha sırtqı Go baylanıssız statikalıq baylanıstı jergilikli ekilik fayllardı shıǵaratuǵın qurallar dizbegi (izbe-izligi).
  • Til specifikaciyasın baǵdarlamashınıń yadında qalatuǵınday,[39] jetkilikli ápiwayı etip saqlaw niyeti, azǵantay uqsas tillerde jiyi ushırasatuǵın imkaniyatlardı alıp taslaw.

Sintaksis

redaktorlaw

Go sintaksisi kodtı qısqa hám oqılatuǵın etip saqlawǵa baǵdarlanǵan C tilindegi ózgerislerdi qamtıydı. Baǵdarlamashıǵa qollanılatuǵın ózgeriwshilerdiń tiplerin kórsetpey i := 3 yamasa s := "Sálem, álem! " dep jazıwǵa imkaniyat beretuǵın deklaraciya/inicializaciya operatorı engizildi. Bul C-diń int i = 3-ne qarsı keledi; hám const char *s = "Sálem, álem";.

Noqatlı útir ele de operatorlardı toqtatadı; biraq qatardıń sońı kelgende jasırın boladı.

Metodlar bir neshe mánislerdi qaytarıwı múmkin hám result, err jubın qaytarıw metodı Go baǵdarlamasında shaqırıwshıǵa qáteni kórsetetuǵın dástúrli metod bolıp tabıladı. Go baǵdarlaması struktura parametrlerin ataw boyınsha inicializaciyalaw hám maps penen slices ushın háriplik sintaksislerdi qosadı. C úsh málimlemeli for cikline alternativ retinde Go baǵdarlamasınıń range sóz dizbegi massivler, bólekler (slices), qatarlar, kartalar (maps) hám kanallar boyınsha qısqasha iteraciyaǵa imkaniyat beredi.[40]

Go-da sanlı (byte,  int64,  float32, h.t.b.), logikalıq mánisler hám bayt qatarları (string) sıyaqlı ornatılǵan tipleri bar. Qatarlar ózgermeydi; ornatılǵan operatorlar menen gilt sózler (funkciyadan góre) biriktiriwdi, salıstırıwdı hám UTF-8 kodlawın/dekodlawın támiyinleydi.[41] Jazıw tiplerin struct gilt sózi menen anıqlawǵa boladı..[42]

Mısallar

redaktorlaw

Sálem álem

redaktorlaw
package main

import "fmt"

func main() {
    fmt.Println("sálem álem")
}

bul jerde "fmt" - C faylınıń kirgiziw/shıǵarıw túrine uqsas formatlanǵan kirgiziw/shıǵarıw paketi.[43]

Parallellik

redaktorlaw

Keyingi ápiwayı programma asinxron programmanı ámelge asırıw ushın Go-diń parallel imkaniyatların kórsetedi. Ol eki jeńil aǵımdı (“goroutines”) iske qosadı: birewi paydalanıwshınıń ayırım tekstti teriwin kútedi, al ekinshisi kútiw waqtın ámelge asıradı. Operator usı gorutinlerdiń qálegeniniń tiykarǵı tártipke xabar jiberiwin kútedi hám birinshi kelgen xabar boyınsha háreket etedi.[44]

package main

import (
    "fmt"
    "time"
)

func readword(ch chan string) {
    fmt.Println("Sózdi terip, Enter klavishin basıń.")
    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("Alındı", word)
    case <-t:
        fmt.Println("Taym-aut.")
    }
}

Testlew paketi go paketlerin avtomatlastırılǵan testlewdi qollap-quwatlaydı.[45] Maqsetli funkciyaǵa mısal:

func ExtractUsername(email string) string {
	at := strings.Index(email, "@")
	return email[:at]
}

Test kodı (Go baǵdarlamasında assert gilt sóziniń joq ekenin esapqa alıń; testler sol pakette <filename>_test.go ishinde jumıs isleydi):

import (
    "testing"
)

func TestExtractUsername(t *testing.T) {
	t.Run("withoutDot", func(t *testing.T) {
		username := ExtractUsername("r@google.com")
		if username != "r" {
			t.Fatalf("Got: %v\n", username)
		}
	})

	t.Run("withDot", func(t *testing.T) {
		username := ExtractUsername("jonh.smith@example.com")
		if username != "jonh.smith" {
			t.Fatalf("Got: %v\n", username)
		}
	})
}

Testlerdi parallel ámelge asırıwǵa boladı.

Veb qosımsha

redaktorlaw

net/http paketi veb-qosımshalardı jaratıwdı qollap-quwatlaydı.

Bul mısalda "Sálem álem!" localhost:8080 ge kirgende.

package main

import (
    "fmt"
    "log"
    "net/http"
)

func helloFunc(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Sálem álem!")
}

func main() {
    http.HandleFunc("/", helloFunc)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Qosımshalar

redaktorlaw

Go standart kitapxanası hámde paydalanıwdıń ápiwayılıǵı sebepli hár túrli domenlerde keńnen qollanıldı.

Ataqlı qosımshalarǵa tómendegiler kiredi: HTTPS ornatıw procesin avtomatlastıratuǵın Caddy veb-serveri, programmalıq támiynattı jaratıw menen jaylastırıwdıń quramalılıǵın jeńilletiwge baǵdarlanǵan konteynerlik platformanı usınatuǵın Docker, jaylastırıwdı, masshtablawdı hám basqarıwdı avtomatlastıratuǵın Kubernetes konteynerlik qollanbalar, CockroachDB, masshtablawǵa hám kúshli úylesimlilikke arnalǵan tarqatılǵan SQL maǵlıwmatlar bazası, hám Hugo, baǵdarlamashılarǵa veb-saytlardı ónimli jaratıwǵa imkaniyat beretuǵın tezlik penen iykemlilikke ústemlik beretuǵın statikalıq sayt generatorı.[46]

Qosımsha mısallar ushın Wikimaǵlıwmatlarǵa baylanıslı sorawdı da qarań

  1. "Google's Go: A New Programming Language That's Python Meets C++" (in en-US). November 10, 2009. https://techcrunch.com/2009/11/10/google-go-language/. 
  2. „Language Design FAQ“ (en-US). The Go Programming Language (16-yanvar 2010-jıl). Qaraldı: 27-fevral 2010-jıl.
  3. Metz. „Google Go boldly goes where no code has gone before“. The Register (5-may 2011-jıl).
  4. „Is the language called Go or Golang?“. — „The language is called Go.“. Qaraldı: 16-mart 2022-jıl.
  5. „Go 1.5 Release Notes“. — „The compiler and runtime are now implemented in Go and assembler, without C.“. Qaraldı: 28-yanvar 2016-jıl.
  6. „Go 1.11 is Released“ (24-avgust 2018-jıl). Qaraldı: 1-yanvar 2019-jıl.
  7. „Installing GCC: Configuration“. — „Ada, Go and Objective-C++ are not default languages“. Qaraldı: 3-dekabr 2011-jıl.
  8. „FAQ: Implementation“. The Go Programming Language (2-avgust 2021-jıl). Qaraldı: 2-avgust 2021-jıl.
  9. „A compiler from Go to JavaScript for running Go code in a browser: Gopherjs/Gopherjs“. GitHub. 12-dekabr 2023-jılda túp nusqadan arxivlendi.
  10. „Go at Google: Language Design in the Service of Software Engineering“. Qaraldı: 8-oktyabr 2018-jıl.
  11. Pike. „Another Go at Language Design“. Stanford EE Computer Systems Colloquium. Stanford University (28-aprel 2010-jıl).
  12. „Frequently Asked Questions (FAQ) - The Go Programming Language“. The Go Programming Language. Qaraldı: 26-fevral 2016-jıl.
  13. Binstock. „Dr. Dobb's: Interview with Ken Thompson“ (18-may 2011-jıl). 5-yanvar 2013-jılda túp nusqadan arxivlendi. Qaraldı: 7-fevral 2014-jıl.
  14. Pike. „Less is exponentially more“ (2012).
  15. Griesemer. „The Evolution of Go“ (2015).
  16. Griesemer. „Hey! Ho! Let's Go!“. Google Open Source. Qaraldı: 17-may 2018-jıl.
  17. „Release History“. The Go Programming Language.
  18. „The Go Gopher - The Go Programming Language“ (en). go.dev. Qaraldı: 9-fevral 2023-jıl.
  19. „Go fonts“. Go (16-noyabr 2016-jıl). Qaraldı: 12-mart 2019-jıl.
  20. „Go Font TTFs“. GitHub. Qaraldı: 2-aprel 2019-jıl.
  21. „Go's New Brand“. The Go Blog. Qaraldı: 9-noyabr 2018-jıl.
  22. Merrick. „Go Developer Survey 2020 Results“. Go Programming Language (9-mart 2021-jıl). Qaraldı: 16-mart 2022-jıl.
  23. Pike. „Arrays, slices (and strings): The mechanics of 'append'“. The Go Blog (26-sentyabr 2013-jıl). Qaraldı: 7-mart 2015-jıl.
  24. „E2E: Erik Meijer and Robert Griesemer“. Channel 9. Microsoft (7-may 2012-jıl).
  25. „Go 2 Draft Designs“. Qaraldı: 12-sentyabr 2018-jıl.
  26. „The Go Blog: Go 2 Draft Designs“ (28-avgust 2018-jıl).
  27. „Proposal: A built-in Go error check function, "try"“. Go repository on GitHub. Qaraldı: 16-mart 2022-jıl.
  28. „Type Parameters — Draft Design“. go.googlesource.com.
  29. „Generics in Go“. bitfieldconsulting.com (17-dekabr 2021-jıl).
  30. „Go 1.18 is released!“. Go Programming Language (15-mart 2022-jıl). Qaraldı: 16-mart 2022-jıl.
  31. „Go 1 and the Future of Go Programs“. The Go Programming Language.
  32. „Go 1.22 Release Notes“. The Go Programming Language.
  33. „Release History“. The Go Programming Language.
  34. „Backward Compatibility, Go 1.21, and Go 2“. The Go Programming Language.
  35. „A Quick Guide to Go's Assembler“. go.dev. Qaraldı: 31-dekabr 2021-jıl.
  36. Pike. „The Go Programming Language“. YouTube. Qaraldı: 1-iyul 2011-jıl.
  37. „Download and install packages and dependencies“.
  38. „GoDoc“. godoc.org.
  39. Pike. „The Changelog“. 20-oktyabr 2013-jılda túp nusqadan arxivlendi. Qaraldı: 7-oktyabr 2013-jıl.
  40. „The Go Programming Language Specification“. The Go Programming Language.
  41. Pike. „Strings, bytes, runes and characters in Go“ (23-oktyabr 2013-jıl).
  42. Doxsey. „Structs and Interfaces — An Introduction to Programming in Go“. www.golang-book.com. Qaraldı: 15-oktyabr 2018-jıl.
  43. „fmt“. The Go Programming Language. Qaraldı: 8-aprel 2019-jıl.
  44. The Go Programming Language Phrasebook. 
  45. „testing“. The Go Programming Language. Qaraldı: 27-dekabr 2020-jıl.
  46. Hopkins, Brandon (13 September 2022). "Static Site Generation with Hugo". Linux Journal. https://www.linuxjournal.com/content/static-site-generation-hugo.