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.