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.

Reply via email to