Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Senario aplikasi penunjuk fungsi dan penutupan di Golang

Senario aplikasi penunjuk fungsi dan penutupan di Golang

王林
王林asal
2024-04-15 18:18:021105semak imbas

Penunjuk fungsi digunakan dalam Go untuk panggil balik fungsi, pelaksanaan tertunda dan polimorfisme. Penutupan digunakan untuk pengurusan negeri, pengendalian acara dan pemulaan malas.

Senario aplikasi penunjuk fungsi dan penutupan di Golang

Senario aplikasi penunjuk fungsi dan penutupan dalam Go

Penunjuk fungsi

Penunjuk fungsi ialah pembolehubah yang menunjuk kepada fungsi. Anda boleh menggunakan kata kunci func untuk mengisytiharkan jenis penunjuk fungsi: 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

Penunjuk fungsi boleh dihantar sebagai parameter kepada fungsi lain: 🎜rrreee🎜🎜Penutupan🎜🎜🎜Penutupan merujuk kepada pembolehubah dalam fungsi luaran skop Fungsi. Penutupan boleh dibuat dengan mentakrifkan fungsi bersarang dalam fungsi: 🎜rrreee🎜🎜Senario aplikasi🎜🎜🎜🎜Penunjuk fungsi🎜🎜
  • Untuk panggilan balik fungsi: lulus fungsi sebagai hujah dan panggilnya pada suatu masa kemudian Panggilnya .
  • Pelaksanaan tertunda: Simpan penunjuk fungsi dalam pembolehubah dan laksanakannya apabila diperlukan.
  • Polimorfisme: Polimorfisme boleh dicapai dengan menghantar penunjuk fungsi yang berbeza kepada fungsi yang sama.
🎜🎜Kes praktikal: Menyusun menggunakan penunjuk fungsi🎜🎜rrreee🎜Dalam kes ini, penunjuk fungsi NamaNama dan Mengikut Umur menentukan pasanganOrang. 🎜🎜🎜Penutupan🎜🎜
  • Untuk pengurusan negeri: Penutupan boleh menyimpan pembolehubah dalam skop fungsi, walaupun fungsi telah kembali.
  • Pengendalian acara: Penutupan boleh digunakan untuk mencipta fungsi yang bertindak balas kepada acara tertentu.
  • Permulaan malas: Penutupan boleh digunakan untuk melambatkan permulaan pembolehubah sehingga ia diperlukan.
🎜🎜Kes praktikal: Menggunakan penutupan untuk melaksanakan pembilang🎜🎜rrreee🎜Dalam kes ini, penutupan getCount menyimpan pembolehubah pembilang dalaman i , dan mengembalikan nilai pertambahan pada setiap panggilan. 🎜

Atas ialah kandungan terperinci Senario aplikasi penunjuk fungsi dan penutupan di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn