Heim  >  Artikel  >  Backend-Entwicklung  >  Der Unterschied zwischen Strukturzeiger und Strukturwertübertragung in Golang-Funktionen

Der Unterschied zwischen Strukturzeiger und Strukturwertübertragung in Golang-Funktionen

WBOY
WBOYOriginal
2024-05-31 19:43:59942Durchsuche

In Go können Funktionsparameter als Wert oder Zeiger übergeben werden. Bei der Wertübergabe wird eine Kopie übergeben, und Änderungen an der Kopie wirken sich nicht auf den Originalwert aus; bei der Zeigerübergabe wird die Adresse übergeben, und Änderungen am Inhalt werden im Originalwert widergespiegelt. In der Praxis kann die Zeigerübergabe zur Codeoptimierung eingesetzt werden, beispielsweise beim Sortieren von Slices. Die Wahl der richtigen Bereitstellungsmethode ist entscheidend für die Optimierung Ihres Codes und die Verbesserung der Leistung.

Golang 函数中 struct 指针与 struct 值传递的区别

Funktionsparameterübergabe in Go: Wertübergabe und Zeigerübergabe

In Go können Funktionsparameter durch Wert- oder Zeigerübergabe übergeben werden. Um die Go-Programmierung zu beherrschen, ist es wichtig, den Unterschied zwischen diesen beiden Bereitstellungsmethoden zu verstehen.

Wertübergabe

Wertübergabe bedeutet, dass eine Funktion eine Kopie des Werts des eingehenden Arguments erhält. Jede Änderung des Parameterwerts hat keinen Einfluss auf den ursprünglichen Wert. Zum Beispiel:

func changeValue(s string) {
    s = "modified"
}

func main() {
    var s = "original"
    changeValue(s)
    fmt.Println(s) //输出: original
}

In der Funktion changeValue ist s eine Kopie des Typs string. Änderungen an s wirken sich nicht auf die ursprüngliche Variable s in der Funktion main aus. changeValue 函数中,sstring 类型的副本。对 s 的修改不会影响 main 函数中的原始 s 变量。

指针传递

指针传递是指函数接收传入参数的地址。对参数内容的任何修改都会反映在原始变量中。例如:

func changePointer(s *string) {
    *s = "modified"
}

func main() {
    var s = "original"
    changePointer(&s)
    fmt.Println(s) //输出: modified
}

changePointer 函数中,s 是指向原始 string 变量 s 的指针。对 *s 的修改会直接修改 main 函数中的原始 s 变量。

实战案例

以下是一个利用指针传递在实际场景中进行代码优化的示例:

type Person struct {
    Name string
    Age  int
}

func sortByName(people []Person) {
    for i := 0; i < len(people)-1; i++ {
        for j := i + 1; j < len(people); j++ {
            if people[i].Name > people[j].Name {
                // 交换 people[i] 和 people[j]
                people[i], people[j] = people[j], people[i]
            }
        }
    }
}

func main() {
    people := []Person{
        {"Alice", 20},
        {"Bob", 25},
        {"Charlie", 30},
    }
    sortByName(people)
    fmt.Println(people) //输出: [{Alice 20} {Bob 25} {Charlie 30}]
}

在这个示例中,sortByName 函数接收一个 Person

Zeigerübergabe

Zeigerübergabe bedeutet, dass die Funktion die Adresse des eingehenden Parameters empfängt. Alle Änderungen am Parameterinhalt werden in der Originalvariablen widergespiegelt. Zum Beispiel:

rrreee

In der Funktion changePointer ist s ein Zeiger auf die ursprüngliche string-Variable s. Änderungen an *s ändern direkt die ursprüngliche Variable s in der Funktion main. 🎜🎜🎜Praktischer Fall🎜🎜🎜Das Folgende ist ein Beispiel für die Verwendung der Zeigerübergabe zur Codeoptimierung in einem realen Szenario: 🎜rrreee🎜In diesem Beispiel empfängt die Funktion sortBy eine Person Zeiger auf das Slice. Durch die Übergabe eines Zeigers kann diese Funktion den Inhalt des Slice direkt ändern, ohne eine Kopie zu erstellen. Dies verbessert die Effizienz der Funktion, insbesondere wenn die Slices groß sind. 🎜🎜🎜Fazit🎜🎜🎜Das Verständnis des Unterschieds zwischen der Wertübergabe und der Zeigerübergabe ist entscheidend für das effiziente Schreiben von Go-Programmen. Die Übergabe per Wert ist geeignet, wenn eine Kopie anstelle des Originalwerts geändert werden muss, während die Übergabe per Zeiger geeignet ist, wenn der Originalwert geändert werden muss. Durch die Auswahl der richtigen Bereitstellungsmethode für Ihre Anforderungen können Sie Ihren Code optimieren und die Leistung Ihres Programms verbessern. 🎜

Das obige ist der detaillierte Inhalt vonDer Unterschied zwischen Strukturzeiger und Strukturwertübertragung in Golang-Funktionen. 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