> Sorry, but your response seems to be about consistency, or "purity" at some level.
> While what Go has may be inconsistent, what functional impact does that have?
Same reasons why Go fixed C's: inside-out type declarations, function pointer syntax, ERRNO, headers, macros, signal handling, UB, all the things that technically had no "functional" impact but still directly contributed to consistency, ergonomics, clarity, ease of comprehension, and (either by proxy or directly) correctness.
> I can't see a need for 'de-structuring' as such, absent tuples.
Your playground example of a, b = b, a is not destructuring a tuple in action? It's basically the same syntax / mechanism as Python's destructuring assignment, which existed since before Go (except Python's was always more powerful).
It's almost like you can do everything you want with a tuple in Go, except for actually holding it in your hand.
> Even if it had real first class tuple types, like Alef did, what would one do with them?
Similar things you'd do with a function without a name - work directly with the data at hand, without having to do the extra round trip to the attic to declare its name or shape.
> Hence if I was creating Go 2.0, I can't see why I'd want to add first class tuples, but could see a use for adding tagged unions.
That would probably break Go. I liked Chris Siebenmann's take on the subject:
https://utcc.utoronto.ca/~cks/space/blog/programming/GoUnion...
https://utcc.utoronto.ca/~cks/space/blog/programming/GoUnion...
https://utcc.utoronto.ca/~cks/space/blog/programming/GoUnion...
Meanwhile tagged unions bring you virtually all the way to ADTs, where pattern matching (generalised destructuring) is basically a must.
(By the way, Python stumbled really badly when it added pattern matching without even having proper structs. It's almost comical, given def __init__(self, ...), that should've been gone as a part of the 3.0 break-the-world.)