고루틴에서는 클로저를 사용하여 로컬 변수를 캡처하여 고루틴 실행 중에 계속 사용할 수 있습니다. 익명 함수에 로컬 변수를 인수로 전달하면 고루틴이 시작될 때 변수를 캡처할 수 있습니다. 클로저를 사용하면 스레드 안전성을 보장하면서 동시에 실행되는 고루틴 간에 데이터를 공유하고 수정할 수 있습니다.
고루틴에서 로컬 변수를 캡처하기 위해 클로저를 사용하는 방법
클로저는 생성 시 이미 존재하는 외부 변수나 리소스에 액세스할 수 있는 함수입니다. Go에서는 익명 함수를 사용하여 클로저를 생성합니다.
지역 변수 캡처
고루틴에서 익명 함수를 시작하면 해당 함수는 고루틴 시작 시 존재하는 모든 지역 변수를 캡처할 수 있습니다.
다음은 지역 변수를 캡처하는 방법에 대한 코드 예입니다.
package main import ( "fmt" "time" ) func main() { i := 0 for i < 10 { go func(i int) { fmt.Println(i) }(i) i++ } time.Sleep(time.Second) }
실용 예
클로저를 사용하여 병렬로 실행되는 카운터를 만들 수 있습니다. 각 고루틴에는 동시에 안전하게 액세스하고 수정할 수 있는 자체 개인 카운터가 있습니다.
package main import ( "fmt" "sync" "sync/atomic" "time" ) func main() { var wg sync.WaitGroup var counter uint64 for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { defer wg.Done() for j := 0; j < 1000000; j++ { // 使用原子操作确保并发安全 atomic.AddUint64(&counter, 1) } fmt.Println("Goroutine", i, "finished") }(i) } wg.Wait() fmt.Println("Total count:", counter) }
이런 방식으로 우리는 10개의 고루틴을 병렬로 생성했으며 각 고루틴에는 자체 카운터가 있으며 동시에 100만 개의 자체 증가 작업을 수행합니다. 우리는 총 개수를 얻습니다. 각 고루틴은 클로저를 사용하여 자체 로컬 카운터 변수를 캡처하므로 카운터에 대한 동시 액세스 및 수정은 스레드로부터 안전합니다.
위 내용은 Goroutine에서 클로저를 사용하여 지역 변수를 캡처하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!