Thanks for the insights!

Yeah, I can see how the convention of "always testing for failure" is 
better than a panic, in that it requires you to handle the possibility of a 
failure for things that may commonly fail.  In that respect though, I don't 
understand why the "comma OK" is optional.  Elm, for instance, handles 
things similarly, and has no panics or errors at all as a result because it 
enforces handling of every possible outcome.  But in Go, it seems like... 
in places where it's not easy to use "comma OK" (maybe in the middle of a 
larger expression), or if I forget, I could easily confuse the default 
result from a boolean map (false) with an actual false value!  In Python or 
Elm, or Ruby, there would be a clear distinction and/or a panic.

I agree that it's not a common case that you might want a panic - in fact I 
*never* want a panic, haha!  I suppose it's more of a question of language 
convention vs. language enforcement.  Because I'm human, and rarely write 
perfect code, I would prefer for the compiler (or the runtime environment) 
to have an error if I make a mistake like that.  And even if in 90% of 
cases, it's not a mistake and can be resolved by using a sensible default 
value, if in 10% of cases it IS a mistake, I feel like it makes more sense 
that the language should enforce handling it, while making it easy to 
specify a default for the 90% of cases where one is actually appropriate.  
In the current situation, there's no way for me to guard against mistakes 
in code maintenance.  I can intentionally panic in a particular instance, 
but if I'm maintaining the code a year later, and make a mistaken 
assumption about the existence of a key, intentionally checking and 
panicking in that case isn't really an option/solution since the definition 
of the context is that it's unintentional :D

I suppose maybe there's a way to setup a style linter to enforce a failure 
check for every map access?  (But that's a lot more tedious than just 
enabling a default where appropriate, or disabling it where it's not...)

On Thursday, August 13, 2020 at 2:11:47 PM UTC-5 Michael Jones wrote:

> Joe, your question is perfectly answered by Axel. 
>
> I'll just share a few (personal) Go "style" comments:
>
> Go likes you to test explicitly for failure where that is possible: did 
> the open fail, did the pipe break, etc.Multiple return values make this 
> clear by avoiding the need for a "reserved" error value of the normal-case 
> return.
>
> Go likes untested actions to work. In your case adding an existing key to 
> a map replaces the old entry, accessing a missing entry returns the default 
> value. ["no surprises"]
>
> Go likes you to combine these approaches to make your own more elaborate 
> behaviors using the "comma OK" approach that Axel shared. In your case, 
> adding, and deleting could complain if there is already a matching entry, 
> or not a matching entry, or -- and this is the real reason -- by looking at 
> the payload of a new or matching entry to use application logic to decide 
> if that's ok or not. Only you can know so Go won't second guess you, and 
> the test-rather-than-panic style is because testing right there is deemed 
> the right way.
>
>
> On Thu, Aug 13, 2020 at 11:42 AM 'Axel Wagner' via golang-nuts <
> golan...@googlegroups.com> wrote:
>
>> No, there isn't, but you can check if the value exists:
>>
>> x, ok := m[k]
>> if !ok {
>>     panic("does not exist")
>> }
>>
>> You can also wrap that with methods, if you want to avoid the extra check.
>>
>> I disagree with you that panicking on a non-existent key is better - 
>> either in general, or in the majority of cases. Personally, I don't think I 
>> encountered many use-cases where the zero-value wasn't the perfect thing to 
>> use. I'm not saying your use-case doesn't exist or even that it's rare, 
>> just that I don't think you can generalize from your experience here.
>>
>> On Thu, Aug 13, 2020 at 8:36 PM Joe Marty <joe....@smartersorting.com> 
>> wrote:
>>
>>> I'm very new to Go - apologies in advance if I'm missing something:
>>>
>>> I find it frustrating that there's no way to create a map that does 
>>> *not* automatically return a zero value for undefined key access by default.
>>>
>>> I love the fact that Go doesn't return "nil" for this use case (I love 
>>> Ruby, but I don't think they got that quite right), but returning a default 
>>> value is worse!  It would make so much more sense if it would just panic 
>>> when accessing an undefined key.  I'm not a Python guy, but I think this is 
>>> something Python got right.  
>>>
>>> Creating a map that returns some default value when you access an 
>>> undefined key should be a special kind of map, or a special argument to 
>>> initializing the map (which Ruby does allow).  In Go, is there even any way 
>>> to create a map that panics when you access an undefined key?
>>>
>>> -Joe
>>>
>>> -- 
>>> 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...@googlegroups.com.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/golang-nuts/f53377a0-ddc1-4842-ac7a-a796d85b7077n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/golang-nuts/f53377a0-ddc1-4842-ac7a-a796d85b7077n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>> -- 
>> 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...@googlegroups.com.
>>
> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/CAEkBMfEc5MO-FS1esLDJGoKRUq0tneJ5v6GR5T8JQMDFgjx9pQ%40mail.gmail.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/CAEkBMfEc5MO-FS1esLDJGoKRUq0tneJ5v6GR5T8JQMDFgjx9pQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>
>
> -- 
>
> *Michael T. jonesmichae...@gmail.com*
>

-- 
*Connect with us here:* LinkedIn 
<https://www.linkedin.com/company/smarter-sorting/>, Facebook 
<https://www.facebook.com/smartersorting>, Instagram 
<https://www.instagram.com/smartersorting/>, Twitter 
<https://twitter.com/SmarterSorting>, BuiltInAustin 
<https://www.builtinaustin.com/company/smarter-sorting>


 
<https://www.smartersorting.com/> 
<https://www.builtinaustin.com/2019/02/05/50-austin-startups-watch-2019?utm_source=PE&utm_medium=organic_social&utm_campaign=50_STW_PE&utm_term=article&utm_content=austin>

-- 
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/3be33769-aa34-491d-af25-dbfe362807c5n%40googlegroups.com.

Reply via email to