Ist Go Auswerteauftrag zwischen Mitglied Anrufungen gewährleistet?

stimmen
-2

Lassen Sie uns sagen, dass ich eine Struktur mit Staat haben, und einige Mitgliederfunktionen auf dieser Struktur. Lassen Sie uns sagen, dass das struct Mitglied eine Instanz des eigenen Typs zurückgibt, und ich rufe zusätzliche Funktionen für diese Instanz, und geben das Ergebnis ein anderes Mitglied auf der Anfangs Instanz als Argument aufgerufen wird. Ist die Reihenfolge des Aufrufs zwischen dem ersten Aufruf, und dem Arguments Aufruf, garantiert?

(Dieses Muster kommt eine Menge, wenn versucht, „Baumeister“ Typ Objekte zu bauen, die einen internen Zustand haben, wie ein Ausdrucksstapel ab.)

package main

import (
    fmt
)

type q struct {
    val int
}

func (s *q) getVal() int {
    return s.val
}

func (s *q) a() *q {
    s.val += 1
    return s
}

func (s *q) b(i int) int {
    return i + s.val
}

func main() {
    s := &q{}
    // this currently prints 2
    // but is that guaranteed?
    fmt.Println(s.a().b(s.getVal()))
}

Genauer gesagt, ist die relative Reihenfolge der Invokation im s.a()Vergleich s.getVal()garantiert? Golang definiert die „lexikalisch von links nach rechts , um“ , sondern nur für einen individuellen Ausdruck, und s.a().b()scheint , wie es ist technisch ein anderer Ausdruck als s.getVal().

Das Verhalten hat derzeit ist das Verhalten Ich würde wollen und erwarten, aber ich kann nicht sagen, ob es auch ein Verhalten, das ich verlassen kann „für immer.“

Veröffentlicht am 13/02/2020 um 23:55
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Der relevante Teil der Spezifikation ist:

alle Funktionsaufrufe, Methodenaufrufe und Kommunikationsvorgänge in lexikalischer von links nach rechts ausgewertet.

und

Bei Paketebene, außer Kraft setzen Initialisierung Abhängigkeiten die von links nach rechts Regel für einzelne Initialisierungsausdrücken, aber nicht für Operanden in jedem Ausdruck:

Beantwortet am 14/02/2020 um 00:15
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more