Senario aplikasi penunjuk fungsi dan penutupan di Golang

王林
Lepaskan: 2024-04-15 18:18:02
asal
1168 orang telah melayarinya

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
Salin selepas log masuk

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

func apply(fn Fn, arg int) int {
    return fn(arg)
}
Salin selepas log masuk

闭包

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

func counter() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}
Salin selepas log masuk

应用场景

函数指针

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

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

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}]
}
Salin selepas log masuk

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

闭包

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

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

func main() {
    getCount := counter()

    fmt.Println(getCount()) // 1
    fmt.Println(getCount()) // 2
    fmt.Println(getCount()) // 3
}
Salin selepas log masuk

在这个案例中,闭包 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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan