Golang의 함수 포인터 및 클로저 적용 시나리오

王林
풀어 주다: 2024-04-15 18:18:02
원래의
1082명이 탐색했습니다.

함수 포인터는 Go에서 함수 콜백, 지연 실행 및 다형성을 위해 사용됩니다. 클로저는 상태 관리, 이벤트 처리 및 지연 초기화에 사용됩니다.

Golang의 함수 포인터 및 클로저 적용 시나리오

Go의 함수 포인터 및 클로저 적용 시나리오

함수 포인터

함수 포인터는 함수를 가리키는 변수입니다.func키워드를 사용하여 함수 포인터 유형을 선언할 수 있습니다.func关键字声明函数指针类型:

type Fn func(int) int
로그인 후 복사

函数指针可以作为参数传递给其他函数:

func apply(fn Fn, arg int) int { return fn(arg) }
로그인 후 복사

闭包

闭包是引用了外部函数作用域中变量的函数。可以通过在函数中定义嵌套函数来创建闭包:

func counter() func() int { i := 0 return func() int { i++ return i } }
로그인 후 복사

应用场景

函数指针

  • 用于函数回调:传递函数作为参数,并在以后某个时候调用它。
  • 延迟执行:将函数指针存储在变量中,并在需要时执行。
  • 多态性:通过将不同的函数指针传递给同一函数,可以实现多态性。

实战案例:使用函数指针进行排序

type Person struct { Name string Age int } type ByName []Person func (a ByName) Len() int { return len(a) } func (a ByName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a ByName) Less(i, j int) bool { return a[i].Name < a[j].Name } type ByAge []Person func (a ByAge) Len() int { return len(a) } func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age } func main() { people := []Person{ {Name: "Alice", Age: 30}, {Name: "Bob", Age: 25}, {Name: "Charlie", Age: 35}, } sort.Sort(ByName(people)) fmt.Println(people) // [{Name: Alice Age: 30} {Name: Bob Age: 25} {Name: Charlie Age: 35}] sort.Sort(ByAge(people)) fmt.Println(people) // [{Name: Bob Age: 25} {Name: Alice Age: 30} {Name: Charlie Age: 35}] }
로그인 후 복사

在这个案例中,函数指针ByNameByAge指定了对Person切片的不同排序标准。

闭包

  • 用于状态管理:闭包可以保存函数作用域中的变量,即使函数已经返回。
  • 事件处理:闭包可以用来创建对特定事件做出响应的函数。
  • 延迟初始化:闭包可以用来延迟初始化变量,直到需要它们为止。

实战案例:使用闭包实现计数器

func main() { getCount := counter() fmt.Println(getCount()) // 1 fmt.Println(getCount()) // 2 fmt.Println(getCount()) // 3 }
로그인 후 복사

在这个案例中,闭包getCount保存了内部计数器变量irrreee

함수 포인터는 다른 함수에 매개변수로 전달될 수 있습니다. rrreeeClosureClosure는 외부 함수의 변수를 참조합니다. 범위 함수입니다. 함수 내에 중첩된 함수를 정의하여 클로저를 생성할 수 있습니다: rrreee애플리케이션 시나리오함수 포인터
  • 함수 콜백의 경우: 함수를 인수로 전달하고 나중에 호출합니다. .
  • 지연 실행: 함수 포인터를 변수에 저장하고 필요할 때 실행합니다.
  • 다형성: 다형성은 동일한 함수에 다른 함수 포인터를 전달하여 달성할 수 있습니다.
실용 사례: 함수 포인터를 사용한 정렬rrreee이 경우 함수 포인터 ByNameByAge는 쌍을 지정합니다.Person 조각에 대한 정렬 기준. Closures
  • 상태 관리: 클로저는 함수가 반환된 경우에도 함수 범위에 변수를 저장할 수 있습니다.
  • 이벤트 처리: 클로저는 특정 이벤트에 응답하는 함수를 만드는 데 사용될 수 있습니다.
  • 지연 초기화: 클로저는 필요할 때까지 변수 초기화를 지연하는 데 사용할 수 있습니다.
실용 사례: 클로저를 사용하여 카운터 구현rrreee이 경우 클로저 getCount는 내부 카운터 변수 i를 저장합니다. 각 호출마다 증가된 값을 반환합니다.

위 내용은 Golang의 함수 포인터 및 클로저 적용 시나리오의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!