> 백엔드 개발 > Golang > golang에서 클로저의 의미와 사용법을 알고 계십니까?

golang에서 클로저의 의미와 사용법을 알고 계십니까?

藏色散人
풀어 주다: 2020-12-24 15:25:42
앞으로
2369명이 탐색했습니다.

다음 칼럼에서는 golang 튜토리얼 칼럼에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿