To be honest, I find this very confusing, especially the statement "Changing a field in that copy won't change anything." because even if I have a copy, I should be able to change the fields, and the changes would be there for the scope, and if I returned the copy, whether by address or copy, the changes would be retained.
-----Original Message----- >From: Ian Lance Taylor <i...@golang.org> >Sent: Nov 20, 2019 11:55 AM >To: Orson Cart <objectivedynam...@gmail.com> >Cc: golang-nuts <golang-nuts@googlegroups.com> >Subject: Re: [go-nuts] Difference with function returning struct and function >returning pointer to struct > >On Wed, Nov 20, 2019 at 9:41 AM Orson Cart <objectivedynam...@gmail.com> wrote: >> >> I'm a newbie to Go having used C and C++ in the past and I'm puzzled about >> something I've just seen. >> >> In the following code getEmployee returns a pointer to a struct. The return >> value is then dereferenced. This code compiles and runs fine: >> >> package main >> >> type employee struct { >> ID int >> name string >> } >> >> var dilbert employee >> >> func main() { >> >> getEmployee().name = "dilbert" >> } >> >> func getEmployee() *employee { >> return &dilbert >> } >> >> However if I modify getEmployee as follows, I get a compilation error: >> >> func getEmployee() employee { >> return dilbert >> } >> >> The error is: cannot assign to getEmployee().name >> >> I assume that it revolves around "assignability" but I'm struggling to >> understand why. >> >> Can anyone tell me why this is? > >There are two kinds of answers. > >One is that the spec only permits setting fields of a struct that is >addressable, and the result of a function call is not addressable. >See https://golang.org/ref/spec#Assignments and >https://golang.org/ref/spec#Address_operators . > >The other kind of answer is that if a function returns a pointer to a >struct, a value of type *employee, then it's normal for that something >else to have a copy of that pointer, perhaps some data structure or >global variable. In your simple example that is the global variable >"dilbert". So it makes sense to permit setting a field of the result >of calling getEmployee(), a value of type *employee, as setting that >field will change the global variable "dilbert". But when >getEmployee() does not return a pointer, but just returns a value of >type "employee", then that is a copy of the value in the global >variable. Changing a field in that copy won't change anything. The >assignment will be made, and then the result will be discarded. Since >that operation is useless, the language does not permit it. > >Ian > >-- >You received this message because you are subscribed to the Google Groups >"golang-nuts" group. >To unsubscribe from this group and stop receiving emails from it, send an >email to golang-nuts+unsubscr...@googlegroups.com. >To view this discussion on the web visit >https://groups.google.com/d/msgid/golang-nuts/CAOyqgcVz5oaDa98bXMKS5mKW-ya55dewcrUtmQZcy-v0-YUicg%40mail.gmail.com. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/842040269.1664.1574281551187%40wamui-scooby.atl.sa.earthlink.net.