Sobes.tech
Middle

Ինչպես են կառուցված կոնտեքստները Go լեզվում?

sobes.tech AI

Պատասխան AI-ից

context (context.Context) ԳՈ-ում օգտագործվում է տեղեկատվության փոխանցման համար ժամկետների, չեղարկումների և այլ տվյալների միջև 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)
}

Կոնտեքստերը անվտանգ են բազմաթելային և անփոփոխ, ինչը կարևոր է մրցակցային կոդի համար։ Դրանք նախատեսված չեն ֆունկցիայի անօգուտ պարամետրեր փոխանցելու համար, այլ՝ մետա-տեղեկատվության, որը ազդում է գործընթացի կատարմանը։