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.
Tariyxı
redaktorlawGo 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
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].
Ulıwma
redaktorlawGo 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
redaktorlawGo 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
redaktorlawGo-ǵ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]:
- Belgili bir máselelerge ózgeshe usıllar:
- Ornatılǵan parallel primitivleri: jeńil procesler (gorutinler), kanallar hám
selectoperatorı. - 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).
- Ornatılǵan parallel primitivleri: jeńil procesler (gorutinler), kanallar hám
- 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
redaktorlawGo 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].
Tipler
redaktorlawGo-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
redaktorlawSálem álem
redaktorlawpackage 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
redaktorlawKeyingi á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
redaktorlawTestlew 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
redaktorlawnet/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
redaktorlawGo 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ń
Derekler
redaktorlaw- ↑ "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/.
- ↑ «Language Design FAQ» (en-US). The Go Programming Language (2010-jıl 16-yanvar). Qaraldı: 2010-jıl 27-fevral.
- ↑ Metz. «Google Go boldly goes where no code has gone before». The Register (2011-jıl 5-may).
- ↑ «Is the language called Go or Golang?». — „The language is called Go.“. Qaraldı: 2022-jıl 16-mart.
- ↑ «Go 1.5 Release Notes». — „The compiler and runtime are now implemented in Go and assembler, without C.“. Qaraldı: 2016-jıl 28-yanvar.
- ↑ «Go 1.11 is Released» (2018-jıl 24-avgust). Qaraldı: 2019-jıl 1-yanvar.
- ↑ «Installing GCC: Configuration». — „Ada, Go and Objective-C++ are not default languages“. Qaraldı: 2011-jıl 3-dekabr.
- ↑ «FAQ: Implementation». The Go Programming Language (2021-jıl 2-avgust). Qaraldı: 2021-jıl 2-avgust.
- ↑ «A compiler from Go to JavaScript for running Go code in a browser: Gopherjs/Gopherjs». GitHub. 2023-jıl 12-dekabr sánesinde túp nusqadan arxivlendi.
- ↑ «Go at Google: Language Design in the Service of Software Engineering». Qaraldı: 2018-jıl 8-oktyabr.
- ↑ Pike. «Another Go at Language Design». Stanford EE Computer Systems Colloquium. Stanford University (2010-jıl 28-aprel).
- ↑ «Frequently Asked Questions (FAQ) — The Go Programming Language». The Go Programming Language. Qaraldı: 2016-jıl 26-fevral.
- ↑ Binstock. «Dr. Dobb's: Interview with Ken Thompson» (2011-jıl 18-may). 2013-jıl 5-yanvar sánesinde túp nusqadan arxivlendi. Qaraldı: 2014-jıl 7-fevral.
- ↑ Pike. «Less is exponentially more» (2012).
- ↑ Griesemer. «The Evolution of Go» (2015).
- ↑ Griesemer. «Hey! Ho! Let's Go!». Google Open Source. Qaraldı: 2018-jıl 17-may.
- ↑ «Release History». The Go Programming Language.
- ↑ «The Go Gopher — The Go Programming Language» (en). go.dev. Qaraldı: 2023-jıl 9-fevral.
- ↑ «Go fonts». Go (2016-jıl 16-noyabr). Qaraldı: 2019-jıl 12-mart.
- ↑ «Go Font TTFs». GitHub. Qaraldı: 2019-jıl 2-aprel.
- ↑ «Go's New Brand». The Go Blog. Qaraldı: 2018-jıl 9-noyabr.
- ↑ Merrick. «Go Developer Survey 2020 Results». Go Programming Language (2021-jıl 9-mart). Qaraldı: 2022-jıl 16-mart.
- ↑ Pike. «Arrays, slices (and strings): The mechanics of 'append'». The Go Blog (2013-jıl 26-sentyabr). Qaraldı: 2015-jıl 7-mart.
- ↑ «E2E: Erik Meijer and Robert Griesemer». Channel 9. Microsoft (2012-jıl 7-may).
- ↑ «Go 2 Draft Designs». Qaraldı: 2018-jıl 12-sentyabr.
- ↑ «The Go Blog: Go 2 Draft Designs» (2018-jıl 28-avgust).
- ↑ «Proposal: A built-in Go error check function, "try"». Go repository on GitHub. Qaraldı: 2022-jıl 16-mart.
- ↑ «Type Parameters — Draft Design». go.googlesource.com.
- ↑ «Generics in Go». bitfieldconsulting.com (2021-jıl 17-dekabr).
- ↑ «Go 1.18 is released!». Go Programming Language (2022-jıl 15-mart). Qaraldı: 2022-jıl 16-mart.
- ↑ «Go 1 and the Future of Go Programs». The Go Programming Language.
- ↑ «Go 1.22 Release Notes». The Go Programming Language.
- ↑ «Release History». The Go Programming Language.
- ↑ «Backward Compatibility, Go 1.21, and Go 2». The Go Programming Language.
- ↑ «A Quick Guide to Go's Assembler». go.dev. Qaraldı: 2021-jıl 31-dekabr.
- ↑ Pike. «The Go Programming Language». YouTube. Qaraldı: 2011-jıl 1-iyul.
- ↑ «Download and install packages and dependencies».
- ↑ «GoDoc». godoc.org.
- ↑ Pike. «The Changelog». 2013-jıl 20-oktyabr sánesinde túp nusqadan arxivlendi. Qaraldı: 2013-jıl 7-oktyabr.
- ↑ «The Go Programming Language Specification». The Go Programming Language.
- ↑ Pike. «Strings, bytes, runes and characters in Go» (2013-jıl 23-oktyabr).
- ↑ Doxsey. «Structs and Interfaces — An Introduction to Programming in Go». www.golang-book.com. Qaraldı: 2018-jıl 15-oktyabr.
- ↑ «fmt». The Go Programming Language. Qaraldı: 2019-jıl 8-aprel.
- ↑ The Go Programming Language Phrasebook.
- ↑ «testing». The Go Programming Language. Qaraldı: 2020-jıl 27-dekabr.
- ↑ Hopkins, Brandon. "Static Site Generation with Hugo". Linux Journal. https://www.linuxjournal.com/content/static-site-generation-hugo.