Heim >Backend-Entwicklung >Golang >Wann gibt Go einen Wert, eine Referenz oder nichts zurück?

Wann gibt Go einen Wert, eine Referenz oder nichts zurück?

王林
王林nach vorne
2024-02-05 23:24:031058Durchsuche

Wann gibt Go einen Wert, eine Referenz oder nichts zurück?

Frageninhalt

Ich schreibe Code, in dem eine Reihe von Funktionen Elemente aktualisieren, die „als Referenz übergeben“ werden, ähnlich wie in DoSomethingB unten. Für mich als Neuling ist das eher unintuitiv. Ich möchte lieber, dass eine Funktion ihr Ergebnis zurückgibt (es sei denn, es handelt sich um eine Methode und aktualisiert den Empfänger).

Frage:

  1. Gibt es ein gutes Argument für die Verwendung von Mustern wie DoSomethingB? Von DoSomethingA?
  2. ist DoSomethingB (keine Strukturmethode) Wird dies in Go als guter oder akzeptabler Stil angesehen?
package main

import (
    "fmt"
)

func DoSomethingA(someData int) int {
    return someData + 23
}

func DoSomethingB(someData *int) {
    *someData = *someData + 23
}

func DoSomethingC(someData *int) *int {
    tmp := *someData + 23
    return &tmp
}

func main() {
    someDataA := 19
    someDataB := 19
    someDataC := 19
    
    fmt.Printf("1) someDataA=%d, someDataB=%d, someDataC=%d\n", someDataA, someDataB, someDataC)
    
    someDataA = DoSomethingA(someDataA)
    DoSomethingB(&someDataB)
    someDataC = *DoSomethingC(&someDataC)
    
    fmt.Printf("2) someDataA=%d, someDataB=%d, someDataC=%d\n", someDataA, someDataB, someDataC)
}

Gehe zum Playground-Link: https://play.golang.com/p/ELwljCaWDLg


Richtige Antwort


Natürlich schlüsseln wir deine Frage auf:

  1. DoSomethingB vs. DoSomethingA: Es ist hilfreich, ein Muster wie DoSomethingB 这样的模式会很有帮助,从而避免不必要的分配。但是,它可能会导致代码更难理解。使用 DoSomethingA zu verwenden, wenn Sie die Originalvariable ändern möchten, ohne eine Kopie zu erstellen, und so unnötige Zuweisungen vermeiden möchten. Allerdings kann es sein, dass der Code dadurch schwieriger zu verstehen ist. Die Verwendung von

    (Rückgabeergebnis) ist in Go im Allgemeinen idiomatischer und wird aus Gründen der Lesbarkeit oft bevorzugt.
  2. Gilt DoSomethingB als guter Stil in Go? DoSomethingB: Während es in Go nicht ungewöhnlich ist, Code wie

    zu sehen, insbesondere beim Umgang mit großen Datenstrukturen, ermutigt der idiomatische Ansatz von Go dazu, Rückgabewerte zum Ändern von Zeigern zurückzugeben. Die Verwendung von Zeigern zum direkten Ändern von Werten (insbesondere bei integrierten Typen wie Ganzzahlen) kann zu schwer verständlichem Code führen.

DoSomethingCBeispiel

würde als ungrammatisch angesehen werden, da es einen Zeiger auf eine lokale Variable zurückgibt. Dies kann zu undefiniertem Verhalten führen, da der Speicherort nach der Rückkehr der Funktion möglicherweise für andere Zwecke wiederverwendet wird. Am besten vermeiden Sie dieses Muster.

DoSomethingA 这样的模式。如果您有充分的理由修改原始数据并且担心性能(例如大型数据结构),那么 DoSomethingBZusammenfassend: Wenn Sie dem idiomatischen Go folgen möchten, bevorzugen

dieses Muster. Wenn Sie einen guten Grund haben, die Originaldaten zu ändern, und sich Sorgen um die Leistung machen (z. B. große Datenstrukturen), ist 🎜 akzeptabel. 🎜

Das obige ist der detaillierte Inhalt vonWann gibt Go einen Wert, eine Referenz oder nichts zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen