Što je red u Golangu?

Sto Je Red U Golangu



Go je popularan programski jezik hvaljen zbog svoje učinkovitosti, jednostavnosti korištenja i prilagodljivosti. S bogatim skupom alata i biblioteka, Go pruža programerima potrebne resurse za izgradnju snažnih i učinkovitih softverskih aplikacija. Iako Go nema repovi u svojoj standardnoj knjižnici kao podatkovnoj strukturi, mogu se implementirati različitim metodama. Razgovarat ćemo o konceptu repovi i kako ih implementirati u ovom vodiču.

Što je red čekanja?

repovi su podatkovne strukture koje se koriste za pohranjivanje i dohvaćanje elemenata unaprijed određenim redoslijedom. To je linearna struktura podataka koja nalikuje hrpi i pridržava se FIFO (prvi ušao, prvi izašao) Pravilo. Može se usporediti s listom čekanja ili linijom u kojoj prva osoba koja stigne prva bude uslužena. Postojeće komponente su ispuštene s prednje strane red , a na poleđini se dodaju novi elementi.

Implementacija reda u Golangu

Provedba a red in Go je jednostavan i učinkovit i može se implementirati pomoću sljedeće četiri metode.







1: Kriške

U Go, a kriška je dinamički niz koji može mijenjati veličinu. Za provedbu a red pomoću a kriška , možemo dodati elemente na stražnju stranu kriška pomoću ugrađene funkcije dodavanja i uklanjanja elemenata s prednje strane kriška pomoću rezanja.



Ovaj je pristup jednostavan za izradu i nudi dobre performanse za operacije dodavanja i rezanja zahvaljujući Go-ovim ugrađenim rezovima. Međutim, metoda rezanja, koja uključuje kopiranje elemenata u novi temeljni niz, može postati neučinkovita ako red proširuje i zahtijeva ponovljene operacije uklanjanja iz reda čekanja.



Sljedeći kod definira red implementacija pomoću odsječka u Go.





glavni paket

uvoz 'fmt'

funkcija glavna ( ) {

red := napraviti ( [ ] sučelje { } , 0 )

red = dodati ( red , 'Engleski' )

red = dodati ( red , 'urdu' )

red = dodati ( red , 'matematika' )

ako samo ( red ) > 0 {

artikal := red [ 0 ]

red = red [ 1 : ]

fmt. Println ( artikal )

}

ako samo ( red ) == 0 {

fmt. Println ( 'Ček čekanja je prazan' )

} drugo {

fmt. Println ( red )

}

}

Gornji Go kod koristi odsječak za konstruiranje jednostavnog red struktura podataka. The dodati() funkcija se koristi za stavljanje elemenata u red čekanja red slice, a operacija slice koja uklanja početni element koristi se za njihovo uklanjanje iz reda čekanja. S fmt.Println() , ispisuje se element koji je uklonjen iz reda čekanja. Kod zatim koristi samo() funkcija za utvrđivanje je li red čekanja prazan, i ako jest, piše “ Red je prazan” pomoću funkcije fmt.Println().

Izlaz



2: Povezani popisi

Čvorovi koji nose vrijednost i pokazivač na sljedeći čvor na popisu čine povezani popis. S dva pokazivača, jedan koji pokazuje na prednju stranu (glavu) liste, a drugi koji pokazuje na stražnju stranu (rep), možemo implementirati red pomoću povezanog popisa. Uklanjanje stavke iz reda čekanja (dequeuing) uključuje uklanjanje čvora na početku popisa, dok dodavanje stavke u red čekanja (equeuing) uključuje dodavanje novog čvora na stražnju stranu popisa.

Ova metoda omogućuje učinkovite operacije stavljanja u red čekanja i uklanjanja iz reda jer je potrebno promijeniti samo pokazivače glave i repa, za razliku od rješenja temeljenog na odsječku gdje bi se elementi morali kopirati.

Koristite povezani popis za implementaciju a red pomoću donjeg koda:

glavni paket

uvoz 'fmt'

vrsta Čvor strukturirati {

sučelje vrijednosti { }

Sljedeći * Čvor

}

vrsta Queue strukturirati {

glava * Čvor

rep * Čvor

}

funkcija glavna ( ) {

red := i Red { glava : nula , rep : nula }

noviČvor := i Čvor { vrijednost : 'Engleski' , Sljedeći : nula }

red. rep = noviČvor

red. glava = noviČvor

noviČvor = i Čvor { vrijednost : 'urdu' , Sljedeći : nula }

red. rep . Sljedeći = noviČvor

red. rep = noviČvor

noviČvor = i Čvor { vrijednost : 'matematika' , Sljedeći : nula }

red. rep . Sljedeći = noviČvor

red. rep = noviČvor

ako red. glava != nula {

artikal := red. glava . vrijednost

red. glava = red. glava . Sljedeći

fmt. Println ( artikal )

}

ako red. glava == nula {

fmt. Println ( 'Ček čekanja je prazan' )

}

}

Struktura čvora predstavlja svaku stavku u redu čekanja i sadrži dva polja: polje vrijednosti za pohranjivanje vrijednosti stavke i sljedeće polje za usmjeravanje na sljedeću stavku u redu čekanja. Struktura Queue koristi svojstva glave i repa za praćenje prednjeg i stražnjeg dijela reda čekanja. The rep je prva stavka označena je svojstvom head, dok je posljednja stavka naznačena svojstvom tail.

Parametri glave i repa početno su postavljeni na nula kada je nova red uspostavlja se u funkciji main(). Pokazivači glave i repa ažuriraju se kako bi dodali tri čvora red s vrijednostima 'engleski', 'urdu', i 'matematika'. The 'Engleski' stavka je tada 'isključeno iz reda čekanja' (uklonjeno) s prednje strane red prikazivanjem njegove vrijednosti i pomicanjem pokazivača glave do sljedećeg čvora u red . Nakon uklanjanja iz reda čekanja, ako glava postane nula, to znači da je red čekanja prazan, a poruka ' Red je prazan” ispisuje se.

Izlaz

3: Strukture

U Gou možete stvoriti prilagođenu strukturu podataka koja se zove a strukturirati predstavljati a red . Ovaj strukturirati može imati polja za pohranu red elemente i metode za dodavanje i uklanjanje stavki, provjeru je li red čekanja prazan i dobivanje trenutne veličine čekanja.

Ovaj način stvaranja a red in Go nudi praktičnu i kapsuliranu implementaciju s metodama jednostavnim za korištenje koje se mogu proširiti i prilagoditi s više značajki. To je fleksibilan pristup koji dopušta izmjene u implementaciji ili dodavanje novih mogućnosti kad god je potrebno.

Stvaranje običaja strukturirati s metodama uključuje pisanje dodatnog koda u usporedbi s druga dva načina, što može povećati složenost. Međutim, također pruža veću fleksibilnost i kontrolu nad provedbom red .

Sljedeći primjer prikazuje stvaranje strukture podataka za predstavljanje a red u Go.

glavni paket

uvoz 'fmt'

vrsta Queue strukturirati {
stavke [ ] sučelje { }
}

funk ( q * Red ) Stavi u red ( sučelje stavke { } ) {
q. stavke = dodati ( q. stavke , artikal )
}

funk ( q * Red ) Dequeue ( ) sučelje { } {
ako samo ( q. stavke ) == 0 {
povratak nula
}
artikal := q. stavke [ 0 ]
q. stavke = q. stavke [ 1 : ]
povratak artikal
}

funk ( q * Red ) Prazno je ( ) bool {
povratak samo ( q. stavke ) == 0
}

funk ( q * Red ) Veličina ( ) int {
povratak samo ( q. stavke )
}


funkcija glavna ( ) {

red := i Red { stavke : napraviti ( [ ] sučelje { } , 0 ) }

red. Stavi u red ( 'Engleski' )
red. Stavi u red ( 'urdu' )
red. Stavi u red ( 'matematika' )

artikal := red. Dequeue ( )
fmt. Println ( artikal )
ako red. Prazno je ( ) {
fmt. Println ( 'Ček čekanja je prazan' )
}

veličina := red. Veličina ( )
fmt. Println ( 'Veličina reda:' , veličina )
}

U gornjem kodu, stavka se dodaje odsječku stavke putem Stavi u red() metoda, koja ga pomiče na kraj red . Slijedeći Prvi ušao, prvi izašao (FIFO) načelo, Dequeue() metoda uzima stavku s prednje strane red i vraća ga. Duljina odsječka artikla provjerava se kao dio Prazno je() provjera metode da se vidi je li red prazno je. Vraćanjem duljine odsječka stavke, Veličina() metoda vraća trenutni rep je veličina.

Funkcija main() koristi Struktura reda čekanja za stvaranje novog red , dodajte mu elemente, uklonite stavke iz njega, odredite je li red je prazan i izračunajte njegovu veličinu.

Izlaz

4: Kanali

U Gou, vrsta ugrađenog kanala može se koristiti za implementaciju a red struktura podataka. Kanal se može stvoriti s veličinom međuspremnika kako bi se ograničio broj elemenata koji se mogu staviti u red čekanja u bilo kojem trenutku. Da biste dodali element u red , može se poslati na kanal pomoću <- dok se za uklanjanje elementa iz reda čekanja može primiti s kanala pomoću istog operatora.

Ovaj pristup može biti vrlo koristan u situacijama u kojima istodobni pristup red je potreban jer su kanali sami po sebi sigurni za istodobnu upotrebu.

Ključno je zapamtiti da su Go kanali tipkani. To znači da putem kanala možete slati samo vrijednosti određene vrste, a s kanala možete primati samo vrijednosti te iste vrste.

Ovo je ilustracija kako koristiti kanal za izgradnju a red struktura podataka u Go.

glavni paket

uvoz (
'fmt'
'vrijeme'
)

vrsta Queue strukturirati {
predmeti chaninterface { }
}

funcNewQueue ( ) * Red {


q := i Red {

stavke : napraviti ( chan sučelje { } ) ,
}
ići q. procesne stavke ( )
povratak q
}

funk ( q * Red ) procesne stavke ( ) {
za artikal := raspon q. stavke {
ako artikal == 'Engleski' {
fmt. Println ( 'Dequeued:' , artikal )
}
}
}


funk ( q * Red ) Stavi u red ( sučelje stavke { } ) {

q. stavke <- artikal

}

funcmain ( ) {
red := NewQueue ( )

red. Stavi u red ( 'Engleski' )
red. Stavi u red ( 'urdu' )
red. Stavi u red ( 'matematika' )

vrijeme . Spavati ( 2 * vrijeme . Drugi )
}

Gornji kod stvara a Struktura reda čekanja s jednim poljem stavke koji je kanal od sučelje{} tip. The Novi red() funkcija stvara novu instancu Red i inicijalizira svoje 'stavke' polje s novim kanalom bez međuspremnika. Također pokreće novu gorutinu za obradu stavki dodanih u red čekanja pomoću procesne stavke() funkcija. The procesne stavke() funkcija provjerava je li primljena stavka jednaka 'Engleski' i ispisuje poruku na konzolu samo za tu stavku. The Stavi u red() funkcija se koristi za dodavanje novih stavki u red čekanja.

Izlaz

Zaključak

Red čekanja bitna je struktura podataka u Gou koja se koristi za pohranjivanje i dohvaćanje elemenata određenim redoslijedom. Provedba a red in Go je siguran za niti, što ih čini idealnim izborom za implementaciju konkurentnosti u programima. Može se implementirati korištenjem odsječaka, povezanih popisa, struktura i kanala. Sve pojedinosti već su navedene u gore navedenim smjernicama.