Скажем, у меня есть с государством-структура, а несколько функций-членов на этой структуру. Допустим, что член структуры возвращает экземпляр своего типа, и я называю дополнительные функции на этом экземпляре, и передать результат вызова какой-либо другой элемент на начальном например, в качестве аргумента. Является ли порядок вызова между первым вызовом, и аргументом вызовом, гарантированы?
(Эта модель приходит много при попытке построить «строитель» объекты типа, которые имеют некоторое внутреннее состояние, как стек выражений.)
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()))
}
В частности, это относительный порядок призывания s.a()
против s.getVal()
гарантированы? Golang определяет «лексический порядок слева направо» , но только для индивидуального выражения, и s.a().b()
кажется, что это технически другое выражение , чем s.getVal()
.
Поведение, которое он в настоящее время является поведение, я бы хотел, и ожидать, но я не могу сказать, является ли это также поведение, я могу рассчитывать на «навсегда.»