News for hackers. Stuff that matters.
Re:My Go Resolutions for 2017 by dilap on Thursday January 19, 2017 @09:43AM (#13436133)

    But the fact that `foo == nil` can return false when foo is actually nil is indefensible. 
You keep saying this, but it's not true.
Re:My Go Resolutions for 2017 by stouset on Thursday January 19, 2017 @03:23PM (#13439166)
Only because go has redefined the terms.

    …

    foo = nil
    bar = foo

    // this check may or may not evaluate as true
    if (bar == nil) {
       …
    }
Saying that `bar` here isn't actually equal to nil if it's an interface is tautological. It's not, but only because the language has defined this to be the case. Go could likewise define `1 == 2` to evaluate to true, and you could reuse the same semantic reasoning to defend it.

The point being argued is that it doesn't matter that go defines this to be the case, the point being argued is that it's surprising, frustrating, and can lead to bugs. Particularly when `bar` starts off as a pointer to a struct, but later is refactored to be an interface type. Code that used to work still compiles, but now encounters a runtime nil panic.

Re:My Go Resolutions for 2017 by dilap on Thursday January 19, 2017 @05:52PM (#13440223)
(See also my response to jerf, above.)

In Go (as in most programming languages) it's not true that the assignment "a = b" implies that "b == foo => a == foo", if a and b are different types.

For example, this C code will print "nope":

    float b = 3.5;
    int a = b;
    printf(a==3.5 ? "yup" : "nope\n");
So back to Go, sure, this is initially surprising, and most people get bit by it at first. Once you know about it, it's fine.

In practice I haven't encountered any refactoring bugs as you describe, though it is theoretically possible.

I personally don't see it as a big issue.

(In retrospect, Go could've help guide intuition better by using a new keyword like "unset" or something to test for the zero-value of interfaces, instead of overloading nil.)

Re:My Go Resolutions for 2017 by dragonwriter on Thursday January 19, 2017 @06:19PM (#13440376)
> In Go (as in most programming languages) it's not true that the assignment "a = b" implies that "b == foo => a == foo", if a and b are different types.

While I haven't counted and compared, I suspect that in most programming languages, "a=b" being a non-error implies that either a and b are the same type and value, or that a and b are values that, if they are of different and comparable types, will compare equal.

There are certainly popular languages that do it the way you describe, but I don't think most languages do.

Re:My Go Resolutions for 2017 by dilap on Thursday January 19, 2017 @08:15PM (#13440994)
That's a fair point.
Re:My Go Resolutions for 2017 by stouset on Thursday January 19, 2017 @08:40PM (#13441120)
> In Go (as in most programming languages) it's not true that the assignment "a = b" implies that "b == foo => a == foo", if a and b are different types.

While this is true, in all of those other cases you have the benefit of compile-time type checking so cannot call a function on the wrong type.

With nil, you get runtime errors.