Heim Backend-Entwicklung Golang Einführung in Funktionen und Methoden in der Go-Sprache

Einführung in Funktionen und Methoden in der Go-Sprache

Jan 06, 2020 pm 05:51 PM
go语言 函数

Einführung in Funktionen und Methoden in der Go-Sprache

Wenn Sie auf eine Funktionsdeklaration ohne Funktionskörper stoßen, bedeutet dies, dass die Funktion nicht in Go implementiert ist.

package math
func Sin(x float64) float //implemented in assembly language
Nach dem Login kopieren

Wenn für jeden Rückgabewert einer Funktion ein Variablenname festgelegt wird, wird dieser mit dem entsprechenden Nullwert initialisiert und der Operand wird in der Rückgabeanweisung der Funktion weggelassen. Diese Verwendung wird als bare bezeichnet zurückkehren.

Bei der Fehlerbehandlung in go wird üblicherweise zuerst eine Reihe von Initialisierungsprüfungen durchgeführt, wobei zuerst der Code verarbeitet wird, der die Fehlerlogik verarbeitet, und dann die eigentliche Logik der Funktion. Dadurch wird der Code prägnanter und vermeidet zu viel Hierarchie.

Beim Definieren einer Funktion können Sie den Funktionstyp als Parameter oder als Rückgabetyp verwenden, um den Abschluss zu implementieren. Es gibt auch anonyme Funktionen, die Lambda-Ausdrücken ähneln. Die strings.Map-Funktion kann zum Experimentieren verwendet werden.

func squares() func() int {
    var x int
    return func() int {
        x++
        return x * x
    }
}
func main() {
    f := squares()
    fmt.Println(f()) // "1"
    fmt.Println(f()) // "4"
    fmt.Println(f()) // "9"
    fmt.Println(f()) // "16"
}
Nach dem Login kopieren

Es gibt Variablenreferenzen in anonymen Funktionen und Quadraten. Aus diesem Grund sind Funktionswerte Referenztypen und Funktionswerte nicht vergleichbar. Go verwendet die Verschlusstechnologie, um Funktionswerte zu implementieren, und Go-Programmierer nennen Funktionswerte auch Schließungen.

Achten Sie auf das Beispielprogramm im Abschnitt „Anonyme Funktionen“ der Golang-Bibel.

Die variable Parameterfunktion der Go-Sprache ist sehr einfach zu verwenden. Sie können mehrere Parameter desselben Typs übergeben oder einen Abschnitt dieses Typs direkt übergeben (beachten Sie, dass Sie die .. Ich denke, es dient dazu, die gleichen Slice-Parameter zu unterscheiden. Wenn Sie unterschiedliche Arten von Variablenparametern verwenden möchten, verwenden Sie die universelle Schnittstelle {} Analysieren Sie einfach die variablen Parameter im Funktionskörper wie ein Slice.

Die Funktion nach dem Defer wird erst dann ausgeführt, wenn die Funktion mit der Defer-Anweisung ausgeführt wird, unabhängig davon, ob die Funktion mit der Defer-Anweisung normal durch Return endet oder aufgrund einer Panik abnormal endet. Sie können mehrere Defer-Anweisungen in einer Funktion ausführen, und ihre Ausführungsreihenfolge ist entgegengesetzt zur Deklarationsreihenfolge

var mu sync.Mutex
var m = make(map[string]int)
func lookup(key string) int {
    mu.Lock()
    defer mu.Unlock()
    return m[key]
}
Nach dem Login kopieren

Beim Debuggen komplexer Programme wird der Defer-Mechanismus häufig auch verwendet, um aufzuzeichnen, wann eine Funktion aufgerufen und beendet werden muss.

func bigSlowOperation() {
    defer trace("bigSlowOperation")() // don't forget the
    extra parentheses
    // ...lots of work…
    time.Sleep(10 * time.Second) // simulate slow
    operation by sleeping
}
func trace(msg string) func() {
    start := time.Now()
    log.Printf("enter %s", msg)
    return func() { 
        log.Printf("exit %s (%s)", msg,time.Since(start)) 
    }
}
Nach dem Login kopieren

Wir müssen nur zuerst den Rückgabewert von double benennen und dann eine Defer-Anweisung hinzufügen. Wir können die Parameter und den Rückgabewert jedes Mal ausgeben, wenn double aufgerufen wird.

func double(x int) (result int) {
    defer func() { fmt.Printf("double(%d) = %d\n", x,result) }()
    return x + x
}
_ = double(4)
// Output:
// "double(4) = 8"
Nach dem Login kopieren

Um die Problemdiagnose zu erleichtern, ermöglicht das Laufzeitpaket Programmierern die Ausgabe von Stack-Informationen. Im folgenden Beispiel geben wir Stapelinformationen aus, indem wir den Aufruf von printStack in der Hauptfunktion verzögern.

gopl.io/ch5/defer2
func main() {
    defer printStack()
    f(3)
}
func printStack() {
    var buf [4096]byte
    n := runtime.Stack(buf[:], false)
    os.Stdout.Write(buf[:n])
}
Nach dem Login kopieren

Sie können für eine Struktur keine Feldnamen und Methodennamen mit demselben Namen definieren, was etwas seltsam ist.

Funktionszeiger: Es gibt tatsächlich Funktionszeiger in go. Verwenden wir die Go-Sprache, um den tabellengesteuerten Modus zu implementieren.

package main

import (
    "fmt"
)

func add(a int, b int) int {
    return a + b 
}

func sub(a int, b int) int {
    return a - b 
}

func main() {
    fm := make(map[int]func(int, int) int)
    fm[1001] = add 
    fm[1002] = sub 
    protocol := 2001
    i := 1
    j := 2
    if func_handle, ok := fm[protocol]; ok {
        println(func_handle(i, j)) 
    } else {
        fmt.Printf("protocol: %d not register!", protocol)
    }   
}
Nach dem Login kopieren

Lokalen Variablenzeiger zurückgeben:

Im Gegensatz zur C-Sprache können GO-Funktionen lokale Änderungszeiger zurückgeben, und der Compiler verwendet die Escape-Analyse, um zu entscheiden, ob Speicher auf dem Heap zugewiesen werden soll.

Sie können das Funktions-Inlining über den Parameter -gcflags „-l -m“ beim Kompilieren deaktivieren. Das hat einige Auswirkungen auf die Speicherzuweisung, die Details sind jedoch unklar.

Es gibt keine sogenannte Referenzübergabe von Funktionsparametern, sie werden alle als Wert übergeben. Der Unterschied besteht nur darin, ob das kopierte Objekt oder der Zeiger übergeben wird. In der C-Sprache wird im Allgemeinen empfohlen, Zeigerparameter zu übergeben, um das Kopieren von Objekten zu vermeiden und die Effizienz zu verbessern.

Aber in Go verlängert der kopierte Zeiger den Lebenszyklus des Zielobjekts und kann auch dazu führen, dass es auf dem Heap zugewiesen wird, sodass der Leistungsverbrauch zu den Kosten für die Heap-Speicherzuweisung hinzukommt und Garbage Collection, während in go Das Kopieren kleiner Objekte auf den Stapel erfolgt tatsächlich sehr schnell. Wenn das Objekt also nicht besonders groß ist oder das Originalobjekt wirklich geändert werden muss, besteht im Allgemeinen keine Notwendigkeit, Zeigerparameter zu übergeben. Bei der gleichzeitigen Programmierung wird auch die Verwendung unveränderlicher Objekte (schreibgeschützt oder kopiert) empfohlen, wodurch die Probleme der Datensynchronisierung beseitigt werden können.

Das Folgende wird Speicher auf dem Heap zuweisen. Übergeben Sie beim Kompilieren -gcflags „-m“, um den Assembler-Code anzuzeigen:

func test(p *int) {
    go func() {
        println(p)
    }() 
}

func main() {
    x := 100 
    p := &x
    test(p)
}
Nach dem Login kopieren

Verwenden Sie ausgehende Parameter. Es wird empfohlen, den Rückgabewert zu verwenden Sie können auch zwei Level-Zeiger verwenden:

func test(p **int) {
    x := 100
    *p = &x
}

func main() {
    var p *int
    test(&p)
    println(*p)
}
Nach dem Login kopieren

Für weitere Go-Sprachkenntnisse beachten Sie bitte die Spalte Go-Sprach-Tutorial auf der chinesischen PHP-Website.

Das obige ist der detaillierte Inhalt vonEinführung in Funktionen und Methoden in der Go-Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Warum hat das Drucken von Saiten mit Println und String () -Funktionen unterschiedliche Effekte? Apr 02, 2025 pm 02:03 PM

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Wie löste ich das Problem des Typs des user_id -Typs bei der Verwendung von Redis -Stream, um Nachrichtenwarteschlangen in GO -Sprache zu implementieren? Apr 02, 2025 pm 04:54 PM

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Was ist der Unterschied zwischen 'var' und 'Typ' Typenwort Definition in der GO -Sprache? Apr 02, 2025 pm 12:57 PM

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...

Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Welche Bibliotheken in GO werden von großen Unternehmen entwickelt oder von bekannten Open-Source-Projekten bereitgestellt? Apr 02, 2025 pm 04:12 PM

Welche Bibliotheken in GO werden von großen Unternehmen oder bekannten Open-Source-Projekten entwickelt? Bei der Programmierung in Go begegnen Entwickler häufig auf einige häufige Bedürfnisse, ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Apr 02, 2025 pm 05:09 PM

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...

Warum gibt es bei Verwendung von SQL.Open keinen Fehler an, wenn DSN leer ist? Warum gibt es bei Verwendung von SQL.Open keinen Fehler an, wenn DSN leer ist? Apr 02, 2025 pm 12:54 PM

Warum meldet der DSN bei Verwendung von SQL.Open keinen Fehler? In Go Language, Sql.open ...

See all articles