Шта је ред у Голангу?

Sta Je Red U Golangu



Го је популаран програмски језик хваљен због своје ефикасности, лакоће употребе и прилагодљивости. Уз богат скуп алата и библиотека, Го пружа програмерима неопходне ресурсе за прављење моћних и ефикасних софтверских апликација. Иако Го нема репови у својој стандардној библиотеци као структури података могу се имплементирати коришћењем различитих метода. Говорићемо о концепту репови и како их имплементирати у овом туторијалу.

Шта је ред чекања?

Таилс су структуре података које се користе за складиштење и преузимање елемената по унапред одређеном редоследу. То је линеарна структура података која подсећа на стек и придржава се ФИФО (први ушао, први изашао) владати. Може се упоредити са листом чекања или редом где се прва услужи особа која је стигла. Постојеће компоненте су испуштене са предње стране куеуе , а на полеђини се додају нови елементи.

Имплементација реда у Голангу

Имплементација а куеуе ин Го је једноставан и ефикасан и може се применити коришћењем следеће четири методе.







1: Кришке

У Го, а кришка је динамички низ који може да мења величину. За спровођење а куеуе користећи кришка , можемо додати елементе на полеђину кришка помоћу уграђене функције додавања и уклањања елемената са предње стране кришка користећи сечење.



Овај приступ је једноставан за изградњу и нуди добре перформансе за операције додавања и сечења захваљујући Го-овим уграђеним резовима. Међутим, метода сечења, која укључује копирање елемената у нови основни низ може постати неефикасна ако куеуе проширује и захтева поновљене операције уклањања из реда.



Следећи код дефинише куеуе имплементација помоћу пресека у Го.





пакет главни

увоз 'фмт'

фунц маин ( ) {

куеуе := направити ( [ ] интерфејс { } , 0 )

куеуе = додати ( куеуе , 'енглески језик' )

куеуе = додати ( куеуе , 'урду' )

куеуе = додати ( куеуе , 'математика' )

ако само ( куеуе ) > 0 {

предмет := куеуе [ 0 ]

куеуе = куеуе [ 1 : ]

фмт. Принтлн ( предмет )

}

ако само ( куеуе ) == 0 {

фмт. Принтлн ( „Ред је празан“ )

} друго {

фмт. Принтлн ( куеуе )

}

}

Горњи Го код користи исечак за конструисање једноставног куеуе структура података. Тхе додати() функција се користи за постављање елемената у ред куеуе слице, а операција пресека која уклања почетни елемент се користи за њихово уклањање из реда. Витх фмт.Принтлн() , одштампан је елемент из реда. Код тада користи само() функција да одреди да ли је ред празан, а ако јесте, пише „ Куеуе је празан” помоћу функције фмт.Принтлн().

Излаз



2: Повезане листе

Чворови који носе вредност и показивач на следећи чвор на листи чине повезану листу. Са два показивача, од којих један показује на предњи део (главу) листе, а други на позадину (реп), можемо применити куеуе користећи повезану листу. Уклањање ставке из реда (постављање у ред) подразумева уклањање чвора на почетку листе, док додавање ставке у ред (постављање у ред) подразумева додавање новог чвора на задњем делу листе.

Овај метод омогућава ефикасне операције стављања у ред и уклањања из реда, јер само показивачи главе и репа морају да се мењају, за разлику од решења заснованог на резовима где би елементи морали да се копирају.

Користите повезану листу за имплементацију а куеуе коришћењем наведеног кода у наставку:

пакет главни

увоз 'фмт'

тип Чвор струцт {

интерфејс вредности { }

следећи * Чвор

}

укуцајте Ред струцт {

глава * Чвор

Реп * Чвор

}

фунц маин ( ) {

куеуе := & Куеуе { глава : нула , Реп : нула }

невНоде := & Чвор { вредност : 'енглески језик' , следећи : нула }

куеуе. Реп = невНоде

куеуе. глава = невНоде

невНоде = & Чвор { вредност : 'урду' , следећи : нула }

куеуе. Реп . следећи = невНоде

куеуе. Реп = невНоде

невНоде = & Чвор { вредност : 'математика' , следећи : нула }

куеуе. Реп . следећи = невНоде

куеуе. Реп = невНоде

ако куеуе. глава != нула {

предмет := куеуе. глава . вредност

куеуе. глава = куеуе. глава . следећи

фмт. Принтлн ( предмет )

}

ако куеуе. глава == нула {

фмт. Принтлн ( „Ред је празан“ )

}

}

Структура Чвор представља сваку ставку у реду и садржи два поља: поље вредности за чување вредности ставке и следеће поље за упућивање на следећу ставку у реду. Структура Куеуе користи својства главе и репа да би пратила предњи и задњи део реда. Тхе таил'с прва ставка је означена својством хеад, док је њена последња ставка означена својством репа.

Параметри главе и репа су првобитно подешени на нула када је нови куеуе се успоставља у функцији маин(). Показивачи главе и репа су ажурирани да додају три чвора у куеуе са вредностима „енглески“, „урду“, и 'математика'. Тхе 'енглески језик' ставка је тада „искључено из реда” (уклоњено) са предње стране куеуе тако што ће приказати његову вредност и унапредити показивач главе на следећи чвор у куеуе . Након уклањања из реда, ако глава постане нулл, то значи да је ред празан, а порука „ Куеуе је празан“ се штампа.

Излаз

3: Структуре

У Го можете креирати прилагођену структуру података под називом а струцт да представља а куеуе . Ово струцт може имати поља за чување куеуе елементе и методе за додавање и уклањање ставки, проверите да ли је ред празан и добијете тренутну величину реда.

Овај начин стварања а куеуе ин Го нуди згодну и инкапсулирану имплементацију са методама лаким за коришћење које се могу проширити и прилагодити са више функција. То је флексибилан приступ који омогућава да се изврше промене у имплементацији или да се додају нове могућности кад год је то потребно.

Креирање обичаја струцт са методама укључује писање додатног кода у поређењу са друга два начина, што може повећати сложеност. Међутим, он такође пружа већу флексибилност и контролу над имплементацијом куеуе .

Следећи пример показује креирање структуре података која представља а куеуе у Го.

пакет главни

увоз 'фмт'

укуцајте Ред струцт {
ставке [ ] интерфејс { }
}

фунц ( к * Куеуе ) У реду ( интерфејс ставке { } ) {
к. ставке = додати ( к. ставке , предмет )
}

фунц ( к * Куеуе ) Декуеуе ( ) интерфејс { } {
ако само ( к. ставке ) == 0 {
повратак нула
}
предмет := к. ставке [ 0 ]
к. ставке = к. ставке [ 1 : ]
повратак предмет
}

фунц ( к * Куеуе ) Празно ( ) боол {
повратак само ( к. ставке ) == 0
}

фунц ( к * Куеуе ) Величина ( ) инт {
повратак само ( к. ставке )
}


фунц маин ( ) {

куеуе := & Куеуе { ставке : направити ( [ ] интерфејс { } , 0 ) }

куеуе. У реду ( 'енглески језик' )
куеуе. У реду ( 'урду' )
куеуе. У реду ( 'математика' )

предмет := куеуе. Декуеуе ( )
фмт. Принтлн ( предмет )
ако куеуе. Празно ( ) {
фмт. Принтлн ( „Ред је празан“ )
}

величина := куеуе. Величина ( )
фмт. Принтлн ( „Величина реда:“ , величина )
}

У горњем коду, ставка се додаје на исечак ставке преко у реду() метод, који га помера на крај куеуе . Пратећи Први ушао, први изашао (ФИФО) принцип, тхе Декуеуе() метода вади ставку са предње стране куеуе и враћа га. Дужина исечка ставке се проверава као део Празно() провера методе да се види да ли куеуе Празно. Враћањем дужине исечка ставки, Величина() метода враћа тренутни таил'с величина.

Функција маин() користи Структура реда да створи нову куеуе , додајте му елементе, уклоните ставке из њега, одредите да ли је куеуе је празан и израчунајте његову величину.

Излаз

4: Канали

У Го, уграђени тип канала се може користити за имплементацију а куеуе структура података. Канал се може креирати са величином бафера како би се ограничио број елемената који се могу ставити у ред у било ком тренутку. Да бисте додали елемент у куеуе , може се послати на канал помоћу <- оператора, док за уклањање елемента из реда, може се примити са канала помоћу истог оператора.

Овај приступ може бити веома користан у ситуацијама када је истовремени приступ куеуе је потребно, пошто су канали инхерентно безбедни за истовремену употребу.

Кључно је запамтити да су Го канали откуцани. То значи да преко канала можете слати само вредности одређеног типа, а са канала можете примати само вредности тог типа.

Ово је илустрација како користити канал за конструисање а куеуе структура података у Го.

пакет главни

увоз (
'фмт'
'време'
)

укуцајте Ред струцт {
ставке цханинтерфаце { }
}

фунцНевКуеуе ( ) * Куеуе {


к := & Куеуе {

ставке : направити ( цхан интерфејс { } ) ,
}
го к. процессИтемс ( )
повратак к
}

фунц ( к * Куеуе ) процессИтемс ( ) {
за предмет := опсег к. ставке {
ако предмет == 'енглески језик' {
фмт. Принтлн ( „Из реда чекања:“ , предмет )
}
}
}


фунц ( к * Куеуе ) У реду ( интерфејс ставке { } ) {

к. ставке <- предмет

}

фунцмаин ( ) {
куеуе := НевКуеуе ( )

куеуе. У реду ( 'енглески језик' )
куеуе. У реду ( 'урду' )
куеуе. У реду ( 'математика' )

време . Спавај ( 2 * време . Друго )
}

Горњи код ствара а Структура реда са једним пољем ставке који је канал од интерфејс{} тип. Тхе НевКуеуе() функција креира нову инстанцу Куеуе и иницијализује свој 'предмети' поље са новим небаферисаним каналом. Такође покреће нову горутину за обраду ставки додатих у ред помоћу процессИтемс() функција. Тхе процессИтемс() функција проверава да ли је примљена ставка једнака 'енглески језик' и штампа поруку на конзоли само за ту ставку. Тхе у реду() функција се користи за додавање нових ставки у ред.

Излаз

Закључак

Ред је суштинска структура података у Го-у која се користи за складиштење и преузимање елемената по одређеном редоследу. Имплементација а куеуе ин Го је сигуран за нити, што их чини идеалним избором за имплементацију паралелности у програмима. Може се имплементирати помоћу пресека, повезаних листа, структура и канала. Потпуни детаљи су већ наведени у горе наведеним смерницама.