Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwende ich die Übergabe von Funktionsargumenten in Go?

Wie verwende ich die Übergabe von Funktionsargumenten in Go?

WBOY
WBOYOriginal
2023-05-11 17:00:331901Durchsuche

Go ist eine stark typisierte Programmiersprache und ihre Funktionsparameter werden als Wert übergeben. Das bedeutet, dass Sie bei der Übergabe eines Parameters an eine Funktion tatsächlich eine Kopie des Parameterwerts erstellen und diesen Wert zur Verarbeitung an die Funktion übergeben. Daher müssen Sie bei der Verwendung der Funktionsparameterübergabe in Go auf die folgenden Punkte achten:

  1. Der Unterschied zwischen Werttypen und Referenztypen

In Go, mit Ausnahme des Basisdatentyps, der ein Werttyp ist, alle Datentypen sind Referenztypen. Wenn Daten vom Werttyp als Funktionsparameter übergeben werden, wird eine Kopie des Werts an die Funktion übergeben. Wenn Daten vom Referenztyp als Funktionsparameter übergeben werden, wird die Adresse der Daten im Speicher übergeben.

Schauen wir uns zum Beispiel den Parameterübergabeprozess des Werttyps bzw. des Referenztyps an:

package main

import "fmt"

func main() {
    // 值类型参数传递
    var a = 10
    fmt.Println("Before call func: ", a) // 输出 10

    changeByVal(a)

    fmt.Println("After call func: ", a) // 输出 10

    // 引用类型参数传递
    var b = []int{1, 2, 3}
    fmt.Println("Before call func: ", b) // 输出 [1 2 3]

    changeByRef(b)

    fmt.Println("After call func: ", b) // 输出 [4 5]
}

// 值类型参数传递
func changeByVal(num int) {
    num = 100
}

// 引用类型参数传递
func changeByRef(arr []int) {
    arr[0] = 4
    arr[1] = 5
}

Wir können sehen, dass im Fall der Parameterübergabe vom Werttyp der Parameterwert innerhalb der Funktion auf 100 geändert wird, aber außerhalb Die a-Variable bleibt davon unberührt. Bei der Übergabe von Referenztypparametern wird der Parameter innerhalb der Funktion geändert, und die tatsächlichen Daten außerhalb der Funktion sind ebenfalls betroffen.

  1. Parameterübergabe vom Zeigertyp

Wenn wir die Referenztypdaten ändern möchten, können wir die Parameterübergabe vom Zeigertyp verwenden. Pointer ist ein Datentyp, der die Adresse einer Variablen speichert, die auch in Go als Wert übergeben wird.

Wir können den &-Operator verwenden, um die Adresse einer Variablen abzurufen, und den *-Operator, um die in der Adresse gespeicherten Daten abzurufen.

Zum Beispiel:

package main

import "fmt"

func main() {
    var a = 10
    var b *int

    b = &a

    fmt.Println("Before call func: ", a) // 输出 10

    changeByPtr(b)

    fmt.Println("After call func: ", a) // 输出 100
}

func changeByPtr(num *int) {
    *num = 100
}

Wir können feststellen, dass die Daten, auf die der Zeiger zeigt (ursprüngliche Variable a), innerhalb der Funktion geändert werden und auch die tatsächlichen externen Daten betroffen sind.

  1. Verwenden Sie ..., um Parameter variabler Länge darzustellen.

Wenn unsere Funktion Parameter variabler Länge empfangen muss, können wir auch ... verwenden, um sie darzustellen. Diese Syntax ähnelt args und kwargs in Python.

Zum Beispiel:

package main

import "fmt"

func main() {
    printNames("John", "Alice", "Bob")
}

func printNames(names ...string) {
    for _, name := range names {
        fmt.Println(name)
    }
}

In diesem Beispiel definieren wir eine Funktion printNames mit Parametern variabler Länge und der empfangene Parametertyp ist string. Innerhalb der Funktion verwenden wir den Bereich, um alle Parameter zu durchlaufen und ihre Werte einzeln auszugeben.

Zusammenfassung

In Go erfolgt die Übergabe von Funktionsparametern nach Wert, daher müssen Sie auf den Unterschied zwischen Werttypen und Referenztypen achten. Wenn Sie Referenztypdaten ändern müssen, können Sie die Übergabe von Zeigertypparametern verwenden. Darüber hinaus können wir auch ... verwenden, um Parameter variabler Länge darzustellen, wodurch es für die Funktion einfacher wird, Parameter variabler Länge zu empfangen.

Das obige ist der detaillierte Inhalt vonWie verwende ich die Übergabe von Funktionsargumenten in Go?. 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