Мавзӯъҳо дар забони Go чӣ гуна сохта шудаанд?
sobes.tech AI
Ҷавоб аз AI
Мавзӯъ (context.Context) дар Go барои интиқоли маълумот дар бораи мӯҳлатҳо, бекоркунӣ ва дигар маълумотҳо байни марзҳои API истифода мешавад. Он як дарахтро намояндагӣ мекунад: ҳар як мавзӯъ фарзандагии ба дигар дорад, ба истиснои реша (context.Background() ё context.TODO()).
Методҳои асосии интерфейси context.Context:
Deadline() (deadline time.Time, ok bool): Мӯҳлати охирро бармегардонад.Done() <-chan struct{}: Каналро бармегардонад, ки дар вақти бекоркунии мавзӯъ баста мешавад.Err() error: Хатогиро бармегардонад, ки ба бекоркунии мавзӯъ оварда расонд.Value(key any) any: Қиматро, ки бо калид дар мавзӯъ алоқаманд аст, бармегардонад.
Мо метавонем бо истифода аз функсияҳои бастаи context эҷод кунем:
context.Background(): Мавзӯи холии реша, ҳамчун асос барои раванди асосӣ истифода мешавад.context.TODO(): Барои ҷойгузинии муваққатӣ истифода мешавад, вақте ки намедонем, ки кадом мавзӯъро истифода барем.context.WithCancel(parent Context): Эҷоди мавзӯи фарзандагӣ ва функсияи бекоркунӣ.context.WithDeadline(parent Context, d time.Time): Эҷоди мавзӯи фарзандагӣ бо мӯҳлат.context.WithTimeout(parent Context, timeout time.Duration): Эҷоди мавзӯи фарзандагӣ бо мӯҳлати муайян.context.WithValue(parent Context, key, val any): Эҷоди мавзӯи фарзандагӣ бо қимат.
Иҷрои асосии Context:
emptyCtx: Бунёдӣ, бе бекоркунӣ ва бе қиматҳо. Барои ин истифода мешавадBackgroundваTODO.cancelCtx: Дастгирии бекоркунӣ. Аз мавзӯи асосӣ ва канали бекоркунӣ иборат аст.timerCtx: Дастгирии мӯҳлат/таймер. АзcancelCtxва таймер иборат аст.valueCtx: Дастгирии интиқоли қиматҳо. Аз мавзӯи асосӣ ва калид-қимат иборат аст.
Ҳангоми бекор кардани мавзӯи падар, ҳамаи мавзӯъҳои фарзандагӣ автоматӣ бекор мешаванд. Ин имкон медиҳад, ки сигнали бекоркунӣ ё мӯҳлатҳоро дар пайванд паҳн кунем.
Масалан истифодаи context.WithCancel:
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Эҷоди мавзӯи асосӣ ва функсияи бекоркунӣ
ctx, cancel := context.WithCancel(context.Background())
defer cancel() // Гарант мекунад, ки дар охир бекор мешавад
go func() {
select {
case <-ctx.Done(): // Чекор аз бекоркунии мавзӯъ
fmt.Println("Задача бекор шуд:", ctx.Err())
return
case <-time.After(5 * time.Second): // Ё дар 5 сония анҷом меёбад
fmt.Println("Задача анҷом ёфт")
}
}()
// Бекоркунии мавзӯъ аз ҷои дигар
time.Sleep(1 * time.Second)
fmt.Println("Бекоркунии мавзӯъ...")
cancel()
// Вақт медиҳем, ки goroutine коркард кунад
time.Sleep(100 * time.Millisecond)
}
Масалан истифодаи context.WithValue:
package main
import (
"context"
"fmt"
)
type userIDKey string
func processRequest(ctx context.Context) {
if userID, ok := ctx.Value(userIDKey("UserID")).(string); ok {
fmt.Println("Коркарди дархост барои User ID:", userID)
} else {
fmt.Println("User ID дар контекст ёфт нашуд")
}
}
func main() {
ctx := context.WithValue(context.Background(), userIDKey("UserID"), "12345")
processRequest(ctx)
}
Мавзӯъҳо бехатар барои истифода дар сӯзанҳо ва тағйирнопазир мебошанд, ки барои коди рақобатӣ муҳим аст. Онҳо барои интиқоли параметрҳои нопурра пешбинӣ нашудаанд, балки барои маълумоти мета, ки ба иҷрои раванди таъсир мерасонанд.