Sobes.tech
Middle

Go тилинде контексттер кандайча түзүлгөн?

sobes.tech AI

AIден жооп

context (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() // Main чыгуу алдында жокко чыгарууну камсыз кылуу

	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()

	// Горутинага жокко чыгарууну иштетүүгө убакыт берүү
	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)
}

Контексттер жиптерге коопсуз жана өзгөртпөйт, бул конкуренциялык код үчүн маанилүү. Алар функциянын түз параметрлерин өткөрүүгө арналган эмес, көбүнчө процесстин аткарылышына таасир этүүчү мета-маалыматтар үчүн колдонулат.