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.

Reply via email to