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.“