>백엔드 개발 >Golang >Golang의 함수 포인터 및 클로저 적용 시나리오

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

王林
王林원래의
2024-04-15 18:18:021193검색

함수 포인터는 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

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

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

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