On Thu, Nov 21, 2019 at 10:05 AM Robert Engels <reng...@ix.netcom.com> wrote:
>
> 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.

The original problem remains: there is no way to enforce an immutable receiver.

>
> > 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/CAMV2RqoQT9FFFotRMhcWunDN5R9dzSXtExkp2%3D1eac_xFJ5gPQ%40mail.gmail.com.

Reply via email to