776 Stimmen

Optionale Parameter in Go?

Kann Go optionale Parameter haben? Oder kann ich einfach zwei Funktionen mit demselben Namen und einer unterschiedlichen Anzahl von Argumenten definieren?

1 Stimmen

In diesem Zusammenhang: So kann man obligatorische Parameter erzwingen, wenn man variadic als optionale Parameter verwendet: Ist es möglich, Kompilierzeit Fehler mit benutzerdefinierten Bibliothek in Golang auslösen?

95 Stimmen

Google hat eine schreckliche Entscheidung getroffen, denn manchmal hat eine Funktion einen 90%igen Anwendungsfall und dann einen 10%igen Anwendungsfall. Das optionale Argument ist für diese 10 % des Anwendungsfalls gedacht. Vernünftige Standardwerte bedeuten weniger Code, weniger Code bedeutet mehr Wartbarkeit.

6 Stimmen

Ich halte den Verzicht auf optionale Parameter für eine gute Entscheidung. Ich habe gesehen, dass optionale Parameter in C++ ziemlich stark missbraucht wurden - 40+ Argumente. Es ist sehr fehleranfällig, die Argumente durchzuzählen und sicherzustellen, dass man das richtige angibt, besonders ohne benannte Parameter. Viel besser ist es, eine Struktur zu verwenden, wie von @deamon erwähnt.

674voto

Andrew Hare Punkte 332190

Go hat keine optionalen Parameter noch unterstützt es das Überladen von Methoden :

Der Methodenversand wird vereinfacht, wenn er nicht auch noch den Typabgleich durchführen muss muss. Erfahrung mit anderen Sprachen hat uns gezeigt, dass eine Vielzahl von Methoden mit demselben Namen aber unterschiedlichen Signaturen gelegentlich nützlich ist, aber in der Praxis auch in der Praxis verwirrend und anfällig sein kann. Nur nach dem Namen abgleichen und Konsistenz in den Typen war eine wichtige vereinfachende Entscheidung in Go's Typ System.

87 Stimmen

Ist make also ein Sonderfall? Oder ist sie gar nicht als Funktion implementiert

93 Stimmen

@Mk12 make ist ein Sprachkonstrukt und die oben genannten Regeln gelten nicht. Siehe diese verwandte Frage .

9 Stimmen

range ist derselbe Fall wie make in diesem Sinne

355voto

Ferguzz Punkte 5267

Ein guter Weg, um so etwas wie optionale Parameter zu erreichen, ist die Verwendung variabler Args. Die Funktion erhält dann ein Stück des von Ihnen angegebenen Typs.

func foo(params ...int) {
    fmt.Println(len(params))
}

func main() {
    foo()
    foo(1)
    foo(1,2,3)
}

0 Stimmen

"Die Funktion empfängt tatsächlich ein Slice des von Ihnen angegebenen Typs" - wie das?

8 Stimmen

Im obigen Beispiel, params ist eine Scheibe aus Ints

134 Stimmen

Aber nur für dieselbe Art von Parametern :(

243voto

deamon Punkte 83176

Sie können eine Struktur verwenden, die die Parameter enthält:

type Params struct {
  a, b, c int
}

func doIt(p Params) int {
  return p.a + p.b + p.c 
}

// you can call it without specifying all parameters
doIt(Params{a: 1, c: 9})

18 Stimmen

Es wäre großartig, wenn Strukturen hier Standardwerte haben könnten; alles, was der Benutzer auslässt, wird standardmäßig auf den Nullwert für diesen Typ gesetzt, der ein geeignetes Standardargument für die Funktion sein kann oder auch nicht.

56 Stimmen

@lytnus, ich hasse es, Haare zu spalten, aber Felder, für die Werte weggelassen werden, würden standardmäßig den "Nullwert" für ihren Typ annehmen; nil ist ein anderes Tier. Sollte der Typ des ausgelassenen Feldes zufällig ein Zeiger sein, wäre der Nullwert nil.

10 Stimmen

@burfl ja, außer dass der Begriff "Nullwert" für int/float/string-Typen absolut nutzlos ist, weil diese Werte sinnvoll sind und man daher nicht unterscheiden kann, ob der Wert in der Struktur weggelassen wurde oder ob absichtlich ein Nullwert übergeben wurde.

200voto

Deleplace Punkte 6222

Für eine beliebige, potentiell große Anzahl von optionalen Parametern ist es eine nette Redewendung, Folgendes zu verwenden Funktionelle Optionen .

Für Ihren Typ Foobar schreiben Sie zunächst nur einen Konstruktor:

func NewFoobar(options ...func(*Foobar) error) (*Foobar, error){
  fb := &Foobar{}
  // ... (write initializations with default values)...
  for _, op := range options{
    err := op(fb)
    if err != nil {
      return nil, err
    }
  }
  return fb, nil
}

wobei jede Option eine Funktion ist, die die Foobar verändert. Bieten Sie dann bequeme Möglichkeiten für den Benutzer, Standardoptionen zu verwenden oder zu erstellen, zum Beispiel :

func OptionReadonlyFlag(fb *Foobar) error {
  fb.mutable = false
  return nil
}

func OptionTemperature(t Celsius) func(*Foobar) error {
  return func(fb *Foobar) error {
    fb.temperature = t
    return nil
  }
}

Spielplatz

Der Übersichtlichkeit halber können Sie dem Typ der Optionen einen Namen geben ( Spielplatz ) :

type OptionFoobar func(*Foobar) error

Wenn Sie obligatorische Parameter benötigen, fügen Sie diese als erste Argumente des Konstruktors vor der variadischen options .

Die wichtigsten Vorteile des Funktionelle Optionen Idiom sind:

  • Ihre API kann im Laufe der Zeit wachsen, ohne dass bestehender Code beschädigt wird, da die Signatur des Konstuktors gleich bleibt, wenn neue Optionen benötigt werden.
  • ermöglicht es den einfachsten Standardverwendungsfall: gar keine Argumente!
  • Sie bietet eine genaue Kontrolle über die Initialisierung komplexer Werte.

Diese Technik wurde geprägt von Rob Pike und auch demonstriert durch Dave Cheney .

42 Stimmen

Clever, aber zu kompliziert. Die Philosophie von Go ist es, Code auf unkomplizierte Weise zu schreiben. Übergeben Sie einfach eine Struktur und testen Sie auf Standardwerte.

22 Stimmen

Zu Ihrer Information: Der ursprüngliche Autor dieser Redewendung, zumindest der erste angegebene Herausgeber, ist Commander Rob Pike, den ich für die Go-Philosophie für maßgeblich genug halte. Link -. commandcenter.blogspot.bg/2014/01/ . Suchen Sie auch nach "Einfach ist kompliziert".

24voto

peterSO Punkte 146133

Weder optionale Parameter noch Funktionsüberladungen werden in Go unterstützt. Go unterstützt jedoch eine variable Anzahl von Parametern: Übergabe von Argumenten an ... Parameter

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X