I wanted to thank you for your time and consideration in expressing these trade-offs with a bit more depth than I’ve read elsewhere.
The argument that a * b * c. . . requires someone to look up the base types isn’t compelling to me. One still does not know the base type, for instance, of a, b, c in float64(a) * float64(b) * float64(c).
No autoconversion requires creating explicit conversion rules instead of using a base version. Frankly, it seems as if it kicks off a uniform version as too hard to make with the right properties, and so forces the programmer to create their own rules.
In this view, it seems to me the value of no standard conversion is to force the programmer to realize conversions are taking place. I would further argue that should error arise due to oversight/sloppy programming, these errors should be caught by unit tests.
To me the utility of pointing out to the programmer autocasting is occurring has utility only should unit tests not catch errors.
I would think of this question as follows. Let escape be the set of functions for which unit test does not catch auto-conversion error, but does catch all other significant coding/design error.
If the cost of escape is smaller than bloat/readability/etc. required to accommodate no autocast, then autoconversion is a winner. Note, accessibility of unit testing is quite good in “Go,” unit tests are essential for many applications (such as cloud applications). It also seems to me the industry is trending towards less QA, and placing more responsibility for proper software function on developers and designers. This in turn increases the need for thorough unit testing.
I doubt this way of looking at the tradeoffs could easily be evaluated, but that’s the way I would think of it.
Note, I LOVE Go. I’ve been writing in “Go” for about 7 years now, and it has enormous merits over “C” and “Python” for a broad range of applications. Decades ago I worked with about four members of the “Green Team,” and they railed against Java-bloat that it became. Hopefully, that will not happen with “Go.”