Two thumbs up, Val! FTA, all your valuable input has been archived and documented at
https://github.com/suntong/lang/blob/master/lang/Go/src/ds/Map-Set1.go https://github.com/suntong/lang/blob/master/lang/Go/src/ds/Map-Set0.go Thanks again! On Fri, Jun 24, 2016 at 9:43 AM, Val wrote: > These questions are not dumb. On the contrary, "by reference" vs "by > values" is a fundamental question in most languages, and the source of many > headaches when used incorrectly so it's worth taking some time to ask and > get it right. > > Yes you may change the values of an existing map, inside any function or > method. > > Go doesn't provide idiomatic ways to have "immutable-like" or "view-like" > builtin containers, except string which are always immutable. When you > have an array, or a slice, or a map, you can always alter its content. > Having said this, if you don't want to caller to modify the data, you may : > - clone the data (make a copy of the map, you have to explicitly loop for > that) and give the clone to the caller. This is called "defensive copying". > - or create custom struct type, containing unexported map, with exported > read-only accessors e.g. func (c *MyCustomContainer) Get(key string) Value > > Cheers > > > On Friday, June 24, 2016 at 3:29:25 PM UTC+2, Tong Sun wrote: >> >> *(Thanks a lot for all your help Val!)* >> >> One last question, which I wasn't able to find myself from >> https://blog.golang.org/go-maps-in-action >> >> Since a map is a pointer, for any function that take map as a parameter, >> or function like, >> >> func (s set) Something(xxx) >> >> Does it means the map values can be changed inside the function? >> >> If yes, what's the proper way to declare it so as to make sure the values >> cannot be changed inside the function? >> >> Thanks, and sorry if the question seems too dumb. >> >> >> ---------- Forwarded message ---------- >> From: Valentin Deleplace @gmail.com >> Date: Fri, Jun 24, 2016 at 2:11 AM >> Subject: Re: [go-nuts] How to init a global map >> To: Tong Sun @gmail.com >> >> No penalty, passing a map around never copies the values. >> But a "pointer to a pointer" receiver is not strictly the same as a >> pointer receiver. >> Le 24 juin 2016 02:19, "Tong Sun" a écrit : >> >>> >>> On Thu, Jun 23, 2016 at 6:54 PM, Val wrote: >>> >>> Even in OO style (e.g. java), you would not be able to write >>>> Set s = null; >>>> s.init( list(1,2,3) ); >>>> >>>> This is (more or less) the same problem with value receiver... the >>>> "constructor-like" idiom in go is a function NewSet, not a method : >>> >>> https://play.golang.org/p/_n56yMhlRt >>> >>> >>> * Now* I understand the reason behind such idiom in go. Yep, everything >>> makes sense now. >>> >>> Thanks a lot for the clear explanation. >>> That really helps. >>> >>> Hmm... wait, >>> >>> map is a reference type >>> >>> >>> Does that means that, this function >>> >>> func (s set) Has(a string) bool { _, ok := s[a]; return ok } >>> >>> is exactly the same as the following? >>> >>> func (s *set) Has(a string) bool { _, ok := (*s)[a]; return ok } >>> >>> I.e., even the set is super super big, there is no pass-by-value penalty >>> in the first version? >>> >>> Thx >>> >>> >> -- > You received this message because you are subscribed to a topic in the > Google Groups "golang-nuts" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/golang-nuts/rssS79X7aUs/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- 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. For more options, visit https://groups.google.com/d/optout.