Heim  >  Artikel  >  Backend-Entwicklung  >  Fallstricke und Best Practices von Golang-Funktionszeigern

Fallstricke und Best Practices von Golang-Funktionszeigern

WBOY
WBOYOriginal
2024-04-15 17:36:02399Durchsuche

Fallstricke und Best Practices bei Funktionszeigern in Go: Fallstrick: Zeiger zeigt auf nicht verfügbare Funktion Best Practice: Verwenden Sie lokale Variablen oder Abschlüsse, um Funktionswerte zu erfassen. Fallstrick: Ändern Sie die Funktion, auf die der Zeiger zeigt. Best Practice: Lassen Sie den Funktionszeiger nicht änderbar und erstellen Sie eine neue Funktion in einem anderen Abschluss. Praktischer Fall: Rückruffunktion Verwenden Sie beispielsweise einen Funktionszeiger, um eine Protokollfunktion zu erstellen, die die Protokollnachricht und den Schweregrad als Parameter der Rückruffunktion übernimmt.

Fallstricke und Best Practices von Golang-Funktionszeigern

Fallstricke und Best Practices von Funktionszeigern in Go

In Go sind Funktionszeiger ein leistungsstarker Mechanismus zum Übergeben von Funktionen als Werte. Bei der Verwendung von Funktionszeigern sind jedoch einige Fallstricke zu beachten:

Falle 1: Funktionszeiger zeigt auf eine nicht verfügbare Funktion

Ein Dangling-Pointer-Fehler tritt auf, wenn ein Funktionszeiger auf eine Funktion zeigt, die nicht mehr verfügbar ist:

func newFunc() {
    // ...
}

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

Best Practice: Erfassen Sie Funktionswerte mithilfe lokaler Variablen oder Abschlüsse.

Um baumelnde Zeiger zu vermeiden, erfassen Sie Funktionswerte in lokalen Variablen oder Abschlüssen:

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

Falle 2: Ändern Sie die Funktion, auf die gezeigt wird Zeiger

Für Funktionen Eine Änderung der Funktion, auf die der Zeiger zeigt, kann zu unbeabsichtigten Konsequenzen führen:

type API interface {
    Call()
}

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

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

Best Practice: Funktionszeiger nicht änderbar lassen

Wenn Sie das Funktionsverhalten ändern müssen, erstellen Sie eine neue Funktion in einem anderen Abschluss :

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

Praktischer Fall: Rückruffunktion

Die Rückruffunktion ist ein häufiges Beispiel für einen Funktionszeiger, der verwendet wird, um den Aufrufer zu benachrichtigen, wenn ein Ereignis eintritt.

Zum Beispiel können wir einen Funktionszeiger verwenden, um eine Protokollierungsfunktion zu erstellen, die die Protokollnachricht und den Schweregrad als Argumente für die Rückruffunktion verwendet:

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)
    }
}

Anschließend können wir die Rückruffunktion verwenden, um die Protokollnachricht an die Protokollierungsfunktion zu senden :

func main() {
    infoLogger := InfoLogger()
    infoLogger("Hello, world!") // 输出:INFO: Hello, world!
}

Das obige ist der detaillierte Inhalt vonFallstricke und Best Practices von Golang-Funktionszeigern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn