다음 칼럼에서는 golang 튜토리얼 칼럼에서 golang의 클로저의 의미와 사용법을 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!
클로저란 무엇인가요?
Go 함수는 클로저일 수 있습니다. 클로저는 함수 본문 외부의 변수를 참조하는 함수 값입니다. 이 함수는 참조된 변수에 액세스하고 값을 할당할 수 있습니다. 즉, 함수는 변수에 "바인딩"됩니다.
신뢰할 수 없는 이해이지만, 클로저는 클래스의 인스턴스와 동일하며 함수 본문 외부의 변수는 이 인스턴스에 저장된 변수와 동일합니다.
클로저가 없으면 함수는 일회성 트랜잭션입니다. 함수가 실행된 후에는 함수의 변수 값을 변경할 수 없습니다(클로저와 함께 메모리가 해제되어야 함). 변수가 해제되지 않는 한 함수는 항상 살아 있고 배타적이므로 나중에 함수의 변수 값을 변경할 수 있습니다(이렇게 하면 Go에서 메모리를 회수하지 않기 때문입니다). 항상 거기에 캐시됩니다.)
클로저의 주요 의미
는 변수의 범위를 줄이고 전역 변수의 오염을 줄이는 것입니다. 글로벌 변수를 사용하여 다음과 같은 누적을 구현하면 글로벌 변수가 다른 변수에 의해 쉽게 오염될 수 있습니다. 동시에 n개의 누산기를 구현하려면 매번 n개의 전역 변수가 필요합니다. 배낭을 사용하여 생성된 각 누산기 myAdder1, myAdder2 := adder(), adder()
에는 myAdder1.sum 및 myAdder2.sum으로 볼 수 있는 자체 독립 합계가 있습니다.
백팩을 사용하여 자체 상태로 기능을 구현할 수 있습니다!
package mainimport ( "fmt")func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum }}func main() { myAdder := adder() // 从1加到10 for i := 1; i <= 10; i++ { myAdder(i) } fmt.Println(myAdder(0)) // 再加上45 fmt.Println(myAdder(45))}
결과:
55 // 1+...+10 100
예
클로저를 사용하여 피보나치 수열 구현
package mainimport ( "fmt")func fibonacci() func() int { b0 := 0 b1 := 1 return func() int { tmp := b0 + b1 b0 = b1 b1 = tmp return b1 }}func main() { myFibonacci := fibonacci() for i := 1; i <= 5; i++ { fmt.Println(myFibonacci()) }}
결과:
1 2 3 5 8
실수하기 쉬움
func B() []func() { b := make([]func(), 3, 3) for i := 0; i < 3; i++ { b[i] = func() { fmt.Println(i) } } return b}func main() { c := B() c[0]() c[1]() c[2]()}
결과:
// 因为都引用i,i最后变成了3 3 3 3
수정 방법 1:
package mainimport ( "fmt")func B() []func() { b := make([]func(), 3, 3) for i := 0; i < 3; i++ { j := i b[i] = func() { fmt.Println(j) } } return b}func main() { c := B() c[0]() c[1]() c[2]()}
수정 방법 2:
package mainimport ( "fmt")func B() []func() { b := make([]func(), 3, 3) for i := 0; i < 3; i++ { b[i] = func(j int) func(){ return func() { fmt.Println(j) } }(i) } return b}func main() { c := B() c[0]() c[1]() c[2]()}
더 많은 관련 기술 글을 보시려면 go 언어튜토리얼 칼럼을 방문해 주세요!
위 내용은 golang에서 클로저의 의미와 사용법을 알고 계십니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!