Читаоци попут вас помажу у подршци МУО. Када обавите куповину користећи везе на нашем сајту, можда ћемо зарадити провизију за партнере. Опширније.

Контекст је једна од критичних карактеристика у Го-у која омогућава истовременост. У Го, „контекст“ се односи на пакет који обезбеђује функционалност за вредности у опсегу захтева и сигнале отказивања преко граница АПИ-ја.

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

Контекст пакет

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

Ево како можете да увезете контекстни пакет у свој Го програми.

instagram viewer
увоз"контекст"

Функције контекста преузимају Контекст струцт тип контекстног пакета. Конвенционално, требало би да користите цтк као име променљиве инстанце.

фунцоперације(цтк контекст. Контекст) {
}

Функције могу вратити тип структуре Цонтект за друге функције и операције.

фунцоперације(цтк контекст. Контекст)контекст.Контекст {
}

Можете креирати нови контекст помоћу УРАДИТИ функција контекстног пакета. Функција ТОДО креира нови контекст са вредношћу контекст. Готово(), канал који ће се затворити након отказивања контекста. Требало би да га користите као чувар места када вам је потребан контекст, али ниједан родитељски контекст није прикладан.

увоз"контекст"

фунцглавни() {
цтк := контекст. УРАДИТИ()
}

Алтернативно, тхе Позадина функција креира нови контекст без вредности и празан канал Готово.

цтк := контекст. Позадина()

Требало би да користите функцију Позадина као корен контекстног стабла.

Контекст са вредностима

Пакет контекста пружа функционалност за пропагирање вредности и сигнала отказивања. Можете користити вредности за информације од података у опсегу захтева до сигнала отказивања и рокова.

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

Ево примера преношења контекста кроз функције са контекст пакетом.

увоз (
"контекст"
)

фунцвалуаблеЦонтект(цтк контекст. Контекст)контекст.Контекст {
повратак контекст. ВитхВалуе (цтк, "кључ за приступ", "хфоунекцелквфу")
}

фунцрецеивеЦонтектДата(цтк контекст. Контекст)било који {
пассКеи := цтк. вредност("кључ за приступ")
повратак пассКеи
}

Тхе валуаблеЦонтект функција узима инстанцу контекста и враћа инстанцу контекста за следећу функцију. Инстанца контекста је вредност креирана са ВитхВалуе методом. Метод ВитхВалуе узима инстанцу контекста из функције и пара кључ-вредност.

Да бисте преузели податке из контекста, мораћете да креирате нови контекст са УРАДИТИ или Позадина функцију и проследите контекст функцији (у овом случају валуаблеЦонтект) и примите контекст са рецеивеЦонтектДата функција.

фунцглавни() {
цтк := контекст. Позадина()
цтк = валуаблеЦонтект (цтк)
фмт. Принтлн (рецеивеЦонтектДата (цтк))

}

Променљива цтк је инстанца контекста из Позадинске функције. Функција валуаблеЦонтект преузима променљиву цтк и враћа контекст са вредношћу коју преузима функција рецеивеЦонтектДата и враћа вредност из пара кључ-вредност.

Временска ограничења и рокови контекста

Тхе контекст пакет пружа функционалност за постављање тајм-аута и рокова у операцијама. Подешавање временских ограничења и рокова је корисно за операције које треба да надокнаде.

Временска ограничења су временско трајање операције. Можете подесити временско ограничење да операција траје 4 секунде; након тога контекст поништава захтев.

Са друге стране, рок дефинише апсолутну тачку у којој операција треба да се откаже.

Можете користити ВитхТимеоут метод за постављање временског ограничења контекста. Ево како можете да подесите временско ограничење од 2 секунде.

фунцглавни() {
цтк, откажи := контекст. ВитхТимеоут (контекст. Позадина(), 2 * време. друго)
одложити поништити, отказати()

// нека операција
}

Тхе главни функција креира контекст са временским ограничењем од две секунде. Функција ВитхТимеоут враћа функцију отказивања коју можете одложити за отказивање при изласку из главне функције.

Рокове можете декларисати са ВитхДеадлине методом. ВитхДеадлине метода узима инстанцу контекста и време рока.

фунцУради нешто(цтк контекст. Контекст) {
крајњи рокВреме := време. Сада().Додај(1500 * време. милисекунда)
цтк, цткЦанцел := контекст. ВитхДеадлине (цтк, деадлинеТиме)
одложити цткЦанцел()

// нека операција

цткЦанцел()
}

Тхе Уради нешто функција узима у контексту, а деадлинеТиме променљива је време пре контекст рок. Тхе цтк променљива је контекст са роком.

Тхе цткЦанцел променљива поништава контекст када контекст прекорачи свој рок.

Најбоље праксе за коришћење контекста у Го

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

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