Duh, sorry for the spam - I was reading the text without looking at the code. Makes perfect sense.
-----Original Message----- >From: Robert Engels <reng...@ix.netcom.com> >Sent: Nov 20, 2019 2:31 PM >To: Robert Engels <reng...@ix.netcom.com>, Ian Lance Taylor <i...@golang.org>, >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 > >I must of misread something, because this code works fine: > >package main > >import "fmt" > >type X struct { > x int >} > >func getX() X { > var x X > return x >} > >func main() { > c := getX() > c.x = 1 > fmt.Println(c) >} > >and is what I would expect to happen. Why is this not the same behavior in the >other code? > > > > > >-----Original Message----- >>From: Robert Engels <reng...@ix.netcom.com> >>Sent: Nov 20, 2019 2:25 PM >>To: Ian Lance Taylor <i...@golang.org>, 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 >> >> >>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. > >-- >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/2134227176.1691.1574281911663%40wamui-scooby.atl.sa.earthlink.net. -- 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/181604186.1695.1574281973691%40wamui-scooby.atl.sa.earthlink.net.