В Go, переменная является адресуемым значением, то есть значением, которое вы можете получить по адресу. Вы можете назначить только переменную, но не неадресуемое значение.
bar().Salary = 1
допустимо, поскольку
bar().Salary
на самом деле является syntacti c сахар для (*bar()).Salary
; *bar()
является (структурной) переменной, поскольку вы можете получить ее адрес; - поля (например,
Salary
) структурной переменной сами являются переменными.
Напротив, foo().Salary = 1
недопустимо, потому что foo().Salary
является значением, но это , а не переменная; нет способа получить адрес foo()
. Это объясняет, почему это утверждение отклонено компилятором. Обратите внимание, что введение промежуточной переменной решает вашу проблему:
// type and function declarations omitted
func main() {
f := foo()
f.Salary = 1 // compiles fine
}