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.

Reply via email to