Sobes.tech
Middle

Мавзӯъҳо дар забони 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)
}

Мавзӯъҳо бехатар барои истифода дар сӯзанҳо ва тағйирнопазир мебошанд, ки барои коди рақобатӣ муҳим аст. Онҳо барои интиқоли параметрҳои нопурра пешбинӣ нашудаанд, балки барои маълумоти мета, ки ба иҷрои раванди таъсир мерасонанд.