Suche…


Einführung

Funktionen in Go stellen organisierten, wiederverwendbaren Code bereit, um eine Reihe von Aktionen auszuführen. Funktionen vereinfachen den Codierungsprozess, verhindern redundante Logik und machen Code leichter nachvollziehbar. In diesem Thema werden die Deklaration und Verwendung von Funktionen, Argumenten, Parametern, Rückgabeanweisungen und Gültigkeitsbereichen in Go beschrieben.

Syntax

  • func () // Funktionstyp ohne Argumente und ohne Rückgabewert
  • func (x int) int // akzeptiert eine ganze Zahl und gibt eine ganze Zahl zurück
  • func (a, b int, z float32) bool // akzeptiert 2 ganze Zahlen, einen float und gibt einen booleschen Wert zurück
  • func (Präfixzeichenfolge, Werte ... int) // "variadic" -Funktion, die eine Zeichenfolge und eine oder mehrere ganze Zahlen akzeptiert
  • func () (int, bool) // Funktion, die zwei Werte zurückgibt
  • func (a, b int, z float64, opt ... interface {}) (success bool) // akzeptiert 2 ganze Zahlen, einen float und eine oder mehrere Schnittstellen und gibt den genannten booleschen Wert zurück (der innerhalb der Funktion bereits initialisiert ist )

Grundlegende Erklärung

Eine einfache Funktion, die keine Parameter akzeptiert und keine Werte zurückgibt:

func SayHello() {
    fmt.Println("Hello!")
}

Parameter

Eine Funktion kann optional einen Parametersatz deklarieren:

func SayHelloToMe(firstName, lastName string, age int) {
    fmt.Printf("Hello, %s %s!\n", firstName, lastName)
    fmt.Printf("You are %d", age)
}

Beachten Sie, dass der Typ für firstName wird, da er mit lastName identisch lastName .

Rückgabewerte

Eine Funktion kann einen oder mehrere Werte an den Aufrufer zurückgeben:

func AddAndMultiply(a, b int) (int, int) {
    return a+b, a*b
}

Der zweite Rückgabewert kann auch der Fehler var sein:

import errors

func Divide(dividend, divisor int) (int, error) {
    if divisor == 0 {
        return 0, errors.New("Division by zero forbidden")
    }
    return dividend / divisor, nil
}

Zwei wichtige Dinge müssen beachtet werden:

  • Die Klammer kann für einen einzelnen Rückgabewert weggelassen werden.
  • Jede return Anweisung muss einen Wert für alle deklarierten Rückgabewerte bereitstellen.

Benannte Rückgabewerte

Rückgabewerte können einer lokalen Variablen zugewiesen werden. Eine leere return Anweisung kann dann verwendet werden, um ihre aktuellen Werte zurückzugeben. Dies wird als "nackte" Rückkehr bezeichnet. Naked return-Anweisungen sollten nur in kurzen Funktionen verwendet werden, da sie die Lesbarkeit in längeren Funktionen beeinträchtigen:

func Inverse(v float32) (reciprocal float32) {
    if v == 0 {
        return
    }
    reciprocal = 1 / v
    return
}

spiele es auf dem Spielplatz

//A function can also return multiple values
func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

spiele es auf dem Spielplatz

Zwei wichtige Dinge müssen beachtet werden:

  • Die Klammern um die Rückgabewerte sind obligatorisch .
  • Es muss immer eine leere return Anweisung angegeben werden.

Buchstäbliche Funktionen und Schließungen

Eine einfache wörtliche Funktion, die Hello! zu stdout:

package main

import "fmt"

func main() {
    func(){
        fmt.Println("Hello!")
    }()
}

spiele es auf dem Spielplatz


Eine literale Funktion, die das Argument str nach stdout druckt:

package main

import "fmt"

func main() {
    func(str string) {
        fmt.Println(str)
    }("Hello!")
}

spiele es auf dem Spielplatz


Eine literale Funktion, die die Variable str :

package main

import "fmt"

func main() {
    str := "Hello!"
    func() {
        fmt.Println(str)
    }()
}

spiele es auf dem Spielplatz


Es ist möglich, einer Variablen eine Literalfunktion zuzuweisen:

package main

import (
    "fmt"
)

func main() {
    str := "Hello!"
    anon := func() {
        fmt.Println(str)
    }
    anon()
}

spiele es auf dem Spielplatz

Variadische Funktionen

Eine variadische Funktion kann mit einer beliebigen Anzahl von nachlaufenden Argumenten aufgerufen werden. Diese Elemente werden in einem Slice gespeichert.

package main

import "fmt"

func variadic(strs ...string) {
     // strs is a slice of string
     for i, str := range strs {
         fmt.Printf("%d: %s\n", i, str)
     }
}

func main() {
     variadic("Hello", "Goodbye")
     variadic("Str1", "Str2", "Str3")
}

spiele es auf dem Spielplatz

Sie können auch eine Variadic-Funktion mit einem Slice versehen, mit ... :

func main() {
     strs := []string {"Str1", "Str2", "Str3"}

     variadic(strs...)
}

spiele es auf dem Spielplatz



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow