Go (programmalastırıw tili)

**Go** — kompilyaciyalanǵan joqarı dárejeli programmalastırıw tili. Go tili Google-da Robert Grizemer, Rob Payk hám Ken Tompson tárepinen islep shıǵarılǵan statikalıq jazılǵan programmalastırıw tili. 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. Aldın domen atı golang.org bolǵanlıqtan onı jiyi **Golang** dep te ataydı, biraq onıń anıq atı Go.

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.
* gofrontend, libgo kitapxanası bar basqa kompilyatorlarǵa arnalǵan frontend. GCC kombinaciyası; LLVM-menen kombinaciya — gollvm.

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

## Tariyxı
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. Dizaynerler Google-da qollanılatuǵın basqa tillerge baylanıslı sınlardı qarastırǵısı keldi, biraq olardıń paydalı ózgesheliklerin saqladı:

* 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ı)
* Joqarı ónimli tarmaq hám multiprocessing

Onıń dizaynerlerine, birinshi gezekte C++ tilin unatpawı sebep boldı.

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

### Brending hám stillew

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

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.

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

### Ulıwma
Go baǵdarlamasınıń dáslepki versiyalarında programmalastırıwdı qollawdıń joqlıǵı aytarlıqtay sınǵa ushıradı. 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ı. Google toparı djenerikleri eksperimentlik Go dialekti ushın kem degende bir kompilyator jarattı, biraq onı shıǵarmadı.

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ı. Degen menen, qátelerdi qayta islew usınısı aqırında biykar etildi.

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 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.

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

### Versiyalaw
Go 1 standart kitapxananıń til ózgesheligi menen tiykarǵı bólimleri ushın úylesimlilikke kepillik beredi. Aǵımdaǵı Go 1.22 shıǵarılımına 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. Bul úylesimlilik tildiń tiykarǵı sawda noqatlarınıń biri ekenin esapqa alsaq, Go heshqashan 2.0 dárejesine jetiwdi rejelestirip atırǵan joq.

## Proektlestiriw
Go-ǵa C (ásirese joba 9 dialekti) tásir etedi, 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:
** 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`) hám onlayn paket hújjetleri
* 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, jetkilikli ápiwayı etip saqlaw niyeti, azǵantay uqsas tillerde jiyi ushırasatuǵın imkaniyatlardı alıp taslaw.

### Sintaksis
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.

### Tipler
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. Jazıw tiplerin `struct` gilt sózi menen anıqlawǵa boladı..

## Mısallar

### Sálem álem

```go
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.

### Parallellik
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.
```go
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
Testlew paketi go paketlerin avtomatlastırılǵan testlewdi qollap-quwatlaydı. Maqsetli funkciyaǵa mısal:
```go
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 _test.go ishinde jumıs isleydi):
```go
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
net/http paketi veb-qosımshalardı jaratıwdı qollap-quwatlaydı.

Bul mısalda "Sálem álem!" localhost:8080 ge kirgende. 
```go
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
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ı.

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

## Derekler