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.