To clarify - the author of the package enforces immutability. With Go’s design 
this can be a simple comment on the field. The package shouldn’t be that large 
where this doesn’t work. 

> On Nov 21, 2019, at 10:58 AM, Robert Engels <reng...@ix.netcom.com> wrote:
> 
> 
> Correct, but if the receiver method is mutating it, then it is not an 
> immutable object.
> 
> 
> 
> 
> -----Original Message-----
>> From: burak serdar <bser...@computer.org>
>> Sent: Nov 21, 2019 10:53 AM
>> To: Robert Engels <reng...@ix.netcom.com>
>> Cc: advanderv...@gmail.com, golang-nuts <golang-nuts@googlegroups.com>
>> Subject: Re: [go-nuts] Enforce immutability through static analysis
>> 
>>> On Thu, Nov 21, 2019 at 9:49 AM Robert Engels <reng...@ix.netcom.com> wrote:
>>> 
>>> They can't unless the instance field is exported. Just hide it via 
>>> encapsulation with accessors.
>> 
>> Can't do that with a receiver. All methods of a type are in the same
>> package as the type, so all fields are visible to the receiver.
>> 
>> 
>>> 
>>> -----Original Message-----
>>> From: advanderv...@gmail.com
>>> Sent: Nov 21, 2019 10:15 AM
>>> To: golang-nuts
>>> Subject: [go-nuts] Enforce immutability through static analysis
>>> 
>>> Dear Gophers!
>>> 
>>> I was wonder if it possible to force immutability on the method receiver? I 
>>> know Go doesn't support immutable types and that it is possible to pass the 
>>> receiver by value but if the receiver struct has a field with a pointer 
>>> type the method may still manipulate it:
>>> 
>>> type Counter struct {
>>> n *int
>>> }
>>> 
>>> func (c Counter) Render() string {
>>> *c.n += 1
>>> return strconv.Itoa(*c.n)
>>> }
>>> 
>>> I would like to force (or hint) the the user in writing interface{ Render() 
>>> string } implementations that don't manipulate the method receiver. So that 
>>> they can be considered 'pure' in the functional sense of the word and can 
>>> be called repeatedly without side effects. I would like the user to be able 
>>> to define implementations of interface{ Render() string }such that I can 
>>> safely call the method and use the returned string to write a http.Reponse 
>>> without it changing between requests.
>>> 
>>> I control the way in which Render is called and I am open to crazy answers 
>>> such as:
>>> 
>>> - Maybe it is possible to use reflect to "switch" out the value receiver 
>>> for a temporary value which is discarded after every call?
>>> - Maybe i can use static code analysis to warn the user? How feasible is it 
>>> to prevent all cases of this happening with just static code analysis? can 
>>> this be done at runtime?
>>> - I could instead ask the user to provide a factory function that init new 
>>> Counters but maybe very inefficient if the structs are very large (or have 
>>> many nested structs)?
>>> 
>>> Or maybe there is some possibility that I'm missing?
>>> 
>>> Cheers,
>>> 
>>> Ad
>>> 
>>> 
>>> --
>>> 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/7ee35405-fef4-415b-ae5d-95322b4065aa%40googlegroups.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/1622995561.1365.1574354931169%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/2080138990.1391.1574355466613%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/F9A0E915-48EB-4177-9DA6-C0AC0B1C977F%40ix.netcom.com.

Reply via email to