>  기사  >  백엔드 개발  >  Goroutine에서 클로저를 사용하여 지역 변수를 캡처하는 방법은 무엇입니까?

Goroutine에서 클로저를 사용하여 지역 변수를 캡처하는 방법은 무엇입니까?

WBOY
WBOY원래의
2024-06-05 19:40:01428검색

고루틴에서는 클로저를 사용하여 로컬 변수를 캡처하여 고루틴 실행 중에 계속 사용할 수 있습니다. 익명 함수에 로컬 변수를 인수로 전달하면 고루틴이 시작될 때 변수를 캡처할 수 있습니다. 클로저를 사용하면 스레드 안전성을 보장하면서 동시에 실행되는 고루틴 간에 데이터를 공유하고 수정할 수 있습니다.

如何在 Goroutine 中使用闭包捕获局部变量?

고루틴에서 로컬 변수를 캡처하기 위해 클로저를 사용하는 방법

클로저는 생성 시 이미 존재하는 외부 변수나 리소스에 액세스할 수 있는 함수입니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.