Articles

Go (limbaj de programare)

Posted by admin

Go este influențat de C, dar cu accent pe o mai mare simplitate și siguranță. Limbajul este format din:

  • O sintaxă și de mediu, adoptarea unor modele mai frecvente în dinamică limbi:
    • Optional concis variabile declararea și inițializarea prin tipul de inferență (x := 0 în loc de int x = 0; sau var x = 0;).
    • compilație rapidă.
    • gestionarea pachetelor la distanță (go get) și documentația pachetelor online.,
  • Distinctiv abordări pentru probleme speciale:
    • Built-in concurenta primitive: lumină-greutate procese (goroutines), canale, și select declarație.
    • un sistem de interfață în locul moștenirii virtuale și introduceți încorporarea în loc de moștenire non-virtuală.
    • un toolchain care, în mod implicit, produce binare native legate static fără dependențe externe.,
  • dorința de a păstra specificația limbii suficient de simplu pentru a ține în capul unui programator, în parte prin omiterea caracteristici care sunt comune în limbi similare.

SyntaxEdit

sintaxa lui Go include modificări de la C care vizează păstrarea codului concis și lizibil. Un combinat declarație/inițializare operator a fost introdus, care permite programatorului să scrie i := 3 sau s := "Hello, world!", fără a preciza tipuri de variabile utilizate. Acest lucru contrastează cu C int i = 3; și const char *s = "Hello, world!";., Punct și virgulă termina încă declarații, dar sunt implicite atunci când are loc sfârșitul unei linii. Metodele pot returna mai multe valori, iar returnarea unui result, err pereche este modul convențional în care o metodă indică o eroare apelantului său în Go. Go adaugă sintaxe literale pentru inițializarea parametrilor struct după nume și pentru inițializarea hărților și a feliilor. Ca o alternativă la C e trei-declarație for bucla, Du-te e range expresii vă permite concis repetare peste tablouri, felii, siruri de caractere, hărți, și canale.,

TypesEdit

pentru fiecare tip T și fiecare constantă întreagă non-negativă n, există un tip de matrice notat T; matrice de lungimi diferite sunt astfel de diferite tipuri. Matricele dinamice sunt disponibile ca „felii”, notate T pentru un anumit tip T. Acestea au o lungime și o capacitate care specifică când trebuie alocată o nouă memorie pentru a extinde matricea. Mai multe felii pot partaja memoria lor de bază.indicii sunt disponibili pentru toate tipurile, iar tipul pointer-to-T este notat *T., Adresa și indirectare folosi & și * operatori, la fel ca în C, sau se întâmple, implicit, prin apel de metodă sau atribut acces sintaxă. Nu există nici o aritmetică pointer, cu excepția prin intermediul nesigure speciale.Tip Pointer în biblioteca standard.

pentru o pereche de tipuri k, V, tipul mapV este tipul tabelelor hash care mapează tastele type-K la valorile type-V. Tabelele Hash sunt încorporate în limbaj, cu sintaxă specială și funcții încorporate. chan T este un canal care permite trimiterea de valori de tip T între procesele Go concurente.,

În afară de suportul pentru interfețe, sistemul de tip Go este nominal: cuvântul cheie tip poate fi folosit pentru a defini un nou tip numit, care este diferit de alte tipuri numite care au același aspect (în cazul unui struct, aceiași membri în aceeași ordine). Unele conversii între tipuri (de exemplu, între diferitele tipuri întregi) sunt predefinite și adăugarea unui nou tip poate defini conversii suplimentare, dar conversiile între tipurile numite trebuie întotdeauna invocate în mod explicit., De exemplu, tipul de cuvinte cheie poate fi folosit pentru a defini un tip de adrese IPv4, bazat pe 32-bit numere întregi fără semn:

type ipv4addr uint32

Cu acest tip de definiție, ipv4addr(x) interpretează uint32 valoarea x ca o adresă IP. Pur și simplu atribuirea x la o variabilă de tip ipv4addr este o eroare de tip.

expresii constante pot fi fie tastat sau „untyped”; acestea sunt date un tip atunci când sunt atribuite unei variabile tastat dacă valoarea pe care o reprezintă trece printr-o verificare compilare-time.,

tipurile de funcții sunt indicate de cuvântul cheie func; iau zero sau mai mulți parametri și returnează zero sau mai multe valori, toate fiind tastate. Parametrii și valorile de returnare determină un tip de funcție; astfel, func(string, int32) (int, error) este tipul de funcții care iau un șir și un număr întreg semnat pe 32 de biți și returnează un număr întreg semnat (cu lățimea implicită) și o valoare a erorii de tip interfață încorporată.orice tip numit are un set de metode asociat cu acesta., Adresa IP exemplul de mai sus poate fi extins cu o metodă pentru a verifica dacă valoarea sa este un standard cunoscut:

// ZeroBroadcast reports whether addr is 255.255.255.255.func (addr ipv4addr) ZeroBroadcast() bool { return addr == 0xFFFFFFFF}

din Cauza nominală de tastare, această metodă definiție adaugă o metodă de a ipv4addr, dar nu pe uint32. În timp ce metodele au o definiție specială și sintaxă de apel, nu există un tip de metodă distinct.

interfață systemEdit

Go oferă două caracteristici care înlocuiesc moștenirea clasei.primul este încorporarea, care poate fi privită ca o formă automată de compoziție sau delegare.,: 255

al doilea sunt interfețele sale, care oferă polimorfismul runtime.: 266 interfețele sunt o clasă de tipuri și oferă o formă limitată de tastare structurală în sistemul de tip nominal altfel de Go. Un obiect care este de tip interfață este, de asemenea, de alt tip, la fel ca obiectele C++ fiind simultan dintr-o clasă de bază și derivată. Interfețele Go au fost proiectate după protocoale din limbajul de programare Smalltalk. Mai multe surse folosesc termenul duck tastarea atunci când descrie interfețe Go., Deși termenul de dactilografiere nu este definit cu precizie și, prin urmare, nu este greșit, de obicei implică faptul că conformitatea tipului nu este verificată static. Deoarece conformitatea cu o interfață Go este verificată static de către compilatorul Go (cu excepția cazului în care se efectuează o afirmație de tip), autorii Go preferă termenul de tastare structurală.

definiția unui tip de interfață listează Metodele necesare după nume și tip. Orice obiect de tip T pentru care există funcții care se potrivesc cu toate metodele necesare de interfață de tip I este și un obiect de tip I. Definiția tipului T nu trebuie (și nu poate) să identifice tipul I., De exemplu, dacă forma, pătratul și cercul sunt definite ca

, atunci atât pătratul, cât și cercul sunt implicit o formă și pot fi atribuite unei variabile tipizate în formă.: 263-268 în limbajul formal, sistemul de interfață Go oferă tastare structurală, mai degrabă decât nominală. Interfețele pot încorpora alte interfețe cu efectul de a crea o interfață combinată care este satisfăcută exact de tipurile care implementează interfața încorporată și de orice metode pe care le adaugă interfața nou definită.,: 270

biblioteca standard Go folosește interfețe pentru a oferi genericitate în mai multe locuri, inclusiv sistemul de intrare/ieșire care se bazează pe conceptele de cititor și scriitor.: 282-283

pe lângă metodele de apelare prin interfețe, Go permite conversia valorilor interfeței în alte tipuri cu o verificare de tip run-time. Limbajul construiește pentru a face acest lucru sunt afirmația de tip, care verifică împotriva unui singur tip potențial, și comutatorul de tip, care verifică împotriva mai multor tipuri.,

interfața goală interface{} este un caz de bază important, deoarece se poate referi la un element de orice tip de beton. Este similar cu clasa de obiecte din Java sau C# și este satisfăcut de orice tip, inclusiv Tipuri încorporate, cum ar fi int.:284 Cod folosind gol interface nu poate apela pur și simplu metode (sau built-in de operatori) pe menționate la obiect, dar se pot stoca interface{} valoare, încercați să-l convertească la o mai util tip prin intermediul unui tip de afirmație sau de tip comutator, sau verificați cu e reflect pachet., Pentru că interface{} poate referi la orice valoare, este un mod limitat de a scăpa de restricțiile de static de tastare, cum ar fi void* in C dar cu suplimentare de tip run-time controale.

interface{} tip poate fi folosit pentru modelul structurat de date de orice arbitrar schemă în drum, cum ar fi JSON sau YAML date, reprezentându-l ca un mapinterface{} (harta de sfoară pentru a goli interface). Aceasta descrie recursiv datele sub forma unui dicționar cu chei de șir și valori de orice tip.,valorile interfeței sunt implementate folosind pointer to data și un al doilea pointer to run-time type information. Ca și alte tipuri implementate folosind indicii în Go, valorile interfeței sunt nil dacă nu sunt inițializate.

Pachetul systemEdit

În Go-sistemul de pachete, fiecare pachet are o cale (de exemplu, "compress/bzip2" sau "golang.org/x/net/html") și un nume (de exemplu, bzip2 sau html)., Trimiterile la alte pachete definițiile trebuie să fie întotdeauna precedat cu alte pachetul nume, și numai capitalizate nume din alte pachete sunt accesibile: io.Reader este public, dar bzip2.reader nu este. Comanda go get poate prelua pachete stocate într-un depozit la distanță și dezvoltatorii sunt încurajați să dezvolte pachete în interiorul unei căi de bază corespunzătoare unui depozit sursă (cum ar fi exemplu.,com/user_name / package_name) pentru a reduce probabilitatea de coliziune nume cu adăugiri viitoare la biblioteca standard sau alte biblioteci externe.

există propuneri pentru a introduce o soluție adecvată de gestionare a pachetelor pentru Go similar cu CPAN pentru Perl sau Rust cargo system sau Node NPM system.

Concurrency: goroutines și channelsEdit

limba Go are facilități încorporate, precum și suport pentru bibliotecă, pentru scrierea programelor concurente., Concurenta se referă nu numai la paralelismul procesorului, ci și la asynchrony: permiterea operațiilor lente precum o bază de date sau o rețea de citire în timp ce programul face alte lucrări, așa cum este obișnuit în serverele bazate pe evenimente.

constructul primar de concurență este goroutina, un tip de proces ușor. Un apel funcție prefixat cu go cuvinte cheie începe o funcție într-un nou goroutine., Limba caietul de sarcini nu se specifica cum goroutines ar trebui să fie puse în aplicare, dar implementările actuale multiplex un proces e goroutines pe un set mai mic de sistem de operare fire, similar programării realizate în Erlang.: 10

în timp ce un pachet standard de bibliotecă oferind cele mai multe dintre structurile clasice de control concurenta (încuietori mutex, etc.) este disponibil,:151-152 programe concurente idiomatice preferă în schimb canale, care oferă trimite mesaje între goroutines., Tampoanele opționale stochează mesajele în ordinea FIFO: 43 și permit trimiterea goroutinelor înainte de primirea mesajelor.

Canale sunt tastate, astfel încât un canal de tip chan T poate fi utilizat pentru a transfera mesajele de tip T. sintaxă Specială este folosit pentru a opera pe ele; <-ch este o expresie care determină executarea goroutine de a bloca până la o valoare vine de-a lungul canalului ch, în timp ce ch <- x trimite valoarea x (eventual blochează până când un alt goroutine primește valoarea)., Instrucțiunea built-in switch-like select poate fi utilizată pentru a implementa comunicarea care nu blochează pe mai multe canale; vedeți mai jos un exemplu. Go are un model de memorie care descrie modul în care goroutines trebuie să utilizeze canale sau alte operațiuni pentru a partaja date în siguranță.

existența seturilor de canale diferă de limbile concurente în stil actor, cum ar fi Erlang, unde mesajele sunt adresate direct actorilor (corespunzând goroutinelor)., Actorul stil pot fi simulate într-Du-te prin menținerea un unu-la-unu corespondenta între goroutines și canale, dar limbajul permite mai multe goroutines pentru a partaja un canal sau un singur goroutine pentru a trimite și primi pe mai multe canale.:147

Din aceste instrumente se pot construi concurente constructe ca lucrător piscine, conducte (în care, să zicem, un fișier este decomprimat și analizat ca popularitate), fundal telefoane cu timeout, „fan-out” paralel apeluri către un set de servicii, și altele., Canalele au găsit, de asemenea, folosește în continuare de obicei noțiunea de comunicare inter, ca servind ca o concurenta de siguranță lista de reciclat, tampoanele de punere în aplicare coroutines (care a ajutat inspira numele goroutine), și punerea în aplicare a iteratori.convențiile structurale legate de concurență ale Go (canale și intrări alternative de canal) sunt derivate din modelul de procese secvențiale de comunicare al lui Tony Hoare., Spre deosebire de limbajele de programare concurente anterioare, cum ar fi Occam sau Limbo (un limbaj pe care a lucrat co-designerul Go Rob Pike), Go nu oferă nicio noțiune încorporată de concurență sigură sau verificabilă. În timp ce modelul proceselor de comunicare este favorizat în Go, nu este singurul: toate goroutinele dintr-un program împărtășesc un singur spațiu de adrese. Acest lucru înseamnă că obiectele mutabile și indicii pot fi împărțite între goroutines; a se vedea § lipsa siguranței condiției de rasă, de mai jos.,deși caracteristicile de concurență ale Go nu vizează în primul rând procesarea paralelă, ele pot fi utilizate pentru a programa mașini multi-procesor cu memorie partajată. S-au făcut diverse studii cu privire la eficacitatea acestei abordări. Unul dintre aceste studii au comparat mărimea (în linii de cod) și viteza de programe scrise de un programator experimentat care nu sunt familiarizați cu limba și adaptarea acestor programe de către un expert (de la Google, echipa de dezvoltare), face același lucru pentru Capelă, Cilk și Intel TBB., Studiul a constatat că non-expert tendința de a scrie divide-and-conquer algoritmi cu un du-te declarație pe recursivitate, în timp ce expertul a scris distribui-muncă-sincronizarea programe folosind una goroutine pe procesor. Programele expertului au fost de obicei mai rapide, dar și mai lungi.nu există restricții cu privire la modul în care goroutines accesează datele partajate, făcând posibile condițiile de cursă., Mai exact, dacă un program explicit sincronizează prin canale sau prin alte mijloace, scrie la un goroutine ar putea fi parțial, în întregime, sau nu la toate vizibile la alta, de multe ori cu nici o garanție cu privire la comanda de a scrie. În plus, structurile de date interne ale Go, cum ar fi valorile interfeței, anteturile de felie, tabelele hash și anteturile de șir nu sunt imune la condițiile de rasă, astfel încât siguranța tipului și a memoriei poate fi încălcată în programele multithreaded care modifică instanțele partajate ale acestor tipuri fără sincronizare., În loc de suport lingvistic, programarea simultană sigură se bazează astfel pe convenții; de exemplu, Chisnall recomandă un idiom numit „alias-uri XOR mutabile”, ceea ce înseamnă că trecerea unei valori mutabile (sau pointer) peste un canal semnalează un transfer de proprietate asupra valorii către receptorul său.:155

BinariesEdit

linker în gc toolchain creează legată static binare în mod implicit, prin urmare, toate Merg binare includ Du-te de execuție.,

Omisionsedit

Go omite în mod deliberat anumite caracteristici comune în alte limbi, inclusiv (implementare) moștenire, programare generică, afirmații, aritmetică pointer, conversii de tip implicit, uniuni fără etichete și uniuni etichetate. Designerii au adăugat doar acele facilități pe care toți trei le-au convenit.,dintre caracteristicile limbajului omis, designerii argumentează în mod explicit împotriva afirmațiilor și aritmeticii pointer, apărând în același timp alegerea de a omite moștenirea de tip ca oferind un limbaj mai util, încurajând în schimb utilizarea interfețelor pentru a realiza expedierea dinamică și compoziția pentru reutilizarea codului. Compoziția și delegarea sunt, de fapt, automatizate în mare măsură prin încorporarea struct; potrivit cercetătorilor Schmager et al., această caracteristică „are multe dintre dezavantajele moștenirii: afectează interfața publică a obiectelor, nu este cu granulație fină (eu.,e, nici o metodă nivel de control asupra încorporarea), metodele de obiecte încorporate nu pot fi ascunse, și este static”, făcându-l „evident” dacă programatorii vor exagera în măsura în care programatorii în alte limbi sunt reputate pentru suprasolicitarea moștenire.

designerii exprimă o deschidere către programarea generică și observă că funcțiile încorporate sunt de fapt generice de tip, dar acestea sunt tratate ca cazuri speciale; Pike numește aceasta o slăbiciune care poate fi schimbată la un moment dat. Echipa Google a construit cel puțin un compilator pentru un dialect experimental Go cu generice, dar nu l-a lansat., Ele sunt, de asemenea, deschise la standardizarea modalităților de aplicare a generării de coduri. În iunie 2020, a fost publicat un nou proiect de document de proiectare, care ar adăuga sintaxa necesară pentru declararea funcțiilor și tipurilor generice. Un instrument de traducere a codului go2go a fost furnizat pentru a permite utilizatorilor să încerce noua sintaxă, împreună cu o versiune generică a locului de joacă online Go.,

Inițial omise, cu excepția panica/recupera mecanism a fost în cele din urmă a adăugat, care Merge autori recomanda utilizarea pentru irecuperabil erori, cum ar fi cele care ar trebui să oprească un program întreg sau server cerere, sau ca o comandă rapidă pentru a propaga erori până stiva într-un pachet (dar nu peste limitele pachetului; acolo, eroare de returnare sunt standard API).

Leave A Comment