Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Perangkap dan amalan terbaik penunjuk fungsi Golang

Perangkap dan amalan terbaik penunjuk fungsi Golang

WBOY
WBOYasal
2024-04-15 17:36:02346semak imbas

Fungsi perangkap penunjuk dan amalan terbaik dalam Go: Perangkap: Penunjuk menunjuk ke fungsi tidak tersedia Amalan terbaik: Gunakan pembolehubah atau penutupan setempat untuk menangkap nilai fungsi. Perangkap: Ubah suai fungsi yang ditunjukkan oleh penunjuk Amalan terbaik: Pastikan penunjuk fungsi tidak boleh diubah suai dan cipta fungsi baharu dalam penutupan lain. Kes praktikal: fungsi panggil balik Contohnya, gunakan penuding fungsi untuk mencipta fungsi log yang mengambil mesej log dan tahap keterukan sebagai parameter fungsi panggil balik.

Perangkap dan amalan terbaik penunjuk fungsi Golang

Perangkap dan Amalan Terbaik Penunjuk Fungsi dalam Go

Dalam Go, penunjuk fungsi ialah mekanisme berkuasa untuk menghantar fungsi sebagai nilai. Walau bagaimanapun, terdapat beberapa perangkap yang perlu diberi perhatian apabila menggunakan penunjuk fungsi:

Perangkap 1: Penunjuk fungsi menghala ke fungsi yang tidak tersedia

Ralat penuding berjuntai berlaku apabila penuding fungsi menghala ke fungsi yang tidak lagi tersedia:

func newFunc() {
    // ...
}

func main() {
    newFuncPtr := newFunc // 将函数 newFunc 赋值给指针 newFuncPtr
    newFunc = nil        // 将 newFunc 设为 nil,使其不可用
    newFuncPtr()        // 这会触发悬空指针错误
}

Amalan Terbaik: Tangkap nilai fungsi menggunakan pembolehubah tempatan atau penutupan

Untuk mengelakkan penuding berjuntai, tangkap nilai fungsi ke dalam pembolehubah tempatan atau penutupan:

func main() {
    newFunc := newFunc
    newFunc() // 仍然有效,因为它捕获了 newFunc 的副本
}

Trap 2: Ubah suai oleh fungsi penunjuk

Untuk fungsi Pengubahsuaian fungsi yang ditunjuk oleh penuding boleh membawa kepada akibat yang tidak diingini:

type API interface {
    Call()
}

func makeAPI() API {
    return func() {
        fmt.Println("Hello")
    }
}

func main() {
    apiPtr := makeAPI()
    apiPtr = func() {
        fmt.Println("Goodbye")
    }
    apiPtr.Call() // 输出 "Goodbye"
}

Amalan terbaik: Pastikan penunjuk fungsi tidak boleh diubah suai

Jika anda perlu mengubah suai gelagat fungsi, cipta fungsi baharu dalam penutupan lain :

func main() {
    api := makeAPI()
    api = func(a API) API {
        return func() {
            fmt.Println("Goodbye")
            a.Call()
        }
    }(api)
    api.Call() // 输出 "Hello", 然后是 "Goodbye"
}

Kes praktikal: fungsi panggil balik

Fungsi panggil balik ialah contoh biasa penuding fungsi, yang digunakan untuk memberitahu pemanggil apabila peristiwa berlaku.

Sebagai contoh, kita boleh menggunakan penuding fungsi untuk membina fungsi pengelogan yang mengambil mesej log dan tahap keterukan sebagai hujah kepada fungsi panggil balik:

import "fmt"
import "log"

type Severity string

const (
    Info    Severity = "INFO"
    Warning Severity = "WARNING"
    Error   Severity = "ERROR"
)

func Log(severity Severity, message string) {
    log.Println(fmt.Sprintf("%s: %s", severity, message))
}

// 获取 severity 为 Info 的日志函数
func InfoLogger() func(string) {
    return func(message string) {
        Log(Info, message)
    }
}

Kita kemudian boleh menggunakan fungsi panggil balik untuk menghantar mesej log ke fungsi pengelogan :

rreeee

Atas ialah kandungan terperinci Perangkap dan amalan terbaik penunjuk fungsi 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