One thing to be clear: It is very different if we are talking about "emit a
warning if a value is known to be nil" and "emit a warning unless a warning
is known not to be nil". The former seems fine to me - it is IMO fine for
this code to cause a vet-failure:

var x *int
y := *x

What I'm opposing is the original idea, for this code to cause a
vet-failure:

func (x *int) { *x }

Importantly, whether or not a value is `nil` is *always* going to be a
heuristic <https://en.wikipedia.org/wiki/Halting_problem>.
If we complain about "known to be nil", every finding will always be a bug.
I don't think it's objectionable to find them statically.
If we complain about "not known not to be nil", a significant number of
findings will be non-bugs, leading to changes as OP suggested. So, I'm
assuming that's the situation we are talking about.

On Thu, Mar 24, 2022 at 9:40 AM Sam Hughes <sam.a.hug...@gmail.com> wrote:

> @axel, it my feel counter-intuitive, but a possible runtime panic
> converted to a compiler error is an increase in how robust the code is.
>

Of course. But that's not what we are talking about. We are converting
*some* runtime bugs into compiler errors (really, vet checks, we can't fail
to compile because of backwards compatibility).
But most of them, where it's not clear from the code that a particular
pointer is going to be nil, will get the treatment suggested by OP. Which
ends up exploding the state-space of possible behaviors of a program,
making it exponentially harder to know what it's doing.

That's IMO the less intuitive thing. People tend to think "crashing code is
unreliable". But really, crashing is quite a safe and easy to reason about
behavior. But having to constantly program against any possible bug leads
to unmaintainable, brittle, impossible to reason about code. If every
index-expression, every pointer-dereference and every method call needs to
be wrapped in a conditional, it becomes impossible to really understand
where a failure is coming from and how a program behaves in different
failure modes.

The weird part, at least, why it might feel weird, is that you might never
> encounter the issue as a runtime panic, but as a compiler error, it will
> hit you every time. This will make exploring and experimenting with
> unfamiliar imports, features, and patterns more complicated, but it is the
> entire point, to my mind, of having a type-system.
>
> P.S. Bug in the snippet given by OP? I expected to see "x != nil" instead
> of "x == nil", or else change comments around.
>
>
> On Wednesday, March 23, 2022 at 4:15:13 PM UTC-5 axel.wa...@googlemail.com
> wrote:
>
>> Personally, I think this leads to very unreadable code, for no real
>> benefit.
>> If a nil-pointer dereference happens unexpectedly, that's always a bug. A
>> panic is the correct signal to tell me about that bug, so I can go ahead
>> and fix it. So, making my code less readable to get less robust code seems
>> like a lose-lose proposition to me.
>>
>> Of course, people can always choose to write/use whatever static checker
>> they want. I'm not opposed to this existing. I just don't think it should
>> be in the compiler or in `go vet`.
>>
>> On Wed, Mar 23, 2022 at 10:01 PM 'Michael Toy' via golang-nuts <
>> golan...@googlegroups.com> wrote:
>>
>>> I barely understand Go, so this is likely a stupid idea. Since Go uses
>>> nil for a lot of things, lots of things can be nil.
>>>
>>> I am not a huge fan of the null safe accessor. (
>>> https://github.com/golang/go/issues/42847 )
>>>
>>> I am a huge fan of the compiler telling me the places where I have not
>>> checked for nil ... It took me a while to get used to languages which do
>>> this, but now I can't imagine living without it.
>>>
>>> Is it crazy to wish for ...
>>>
>>> if x == nil {
>>>   // this does not produce an error because x is known not to be nil
>>>   x.interfaceFunc()
>>> }
>>> // this DOES produce an error/warning if y is possibly nil
>>> y.interfaceFunc()
>>>
>>> --
>>> 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/5a700cd9-9274-4756-80a6-9d322232afebn%40googlegroups.com
>>> <https://groups.google.com/d/msgid/golang-nuts/5a700cd9-9274-4756-80a6-9d322232afebn%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+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/14f6ade8-fe5b-4876-b692-ed98764eaa55n%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/14f6ade8-fe5b-4876-b692-ed98764eaa55n%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+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAEkBMfHUW%3D7eKdxNhVE7TcdDLyp8TB3Xmc3BPCSfK-kc2B8wsw%40mail.gmail.com.

Reply via email to