I think c# is an unfair comparison in this instance.
You are right, c# does too much. But Go makes it far more work to do basic things - list comprehension for example (what is everyones obsession with for loops?). An opinated language with one way to do things sounds great, but not at the expense of basic niceities you get in other languages.
arr2 := []int{}
for i := range arr1 {
if arr1[i] > 9 {
arr2 = append(arr2, arr1[i] * 2)
}
}
Is more readable than these?
var arr2 = arr1.Where(x => x > 9).Select(x => x*2);
var arr2 = from x in arr1 where x > 9 select x*2;
arr2 = [x * 2 for x in arr1 where x > 9]
(setf arr2 (loop for x across arr1 when (> x 9) collect (* x 2)))
I honestly can't imagine by what measure any of the latter ones could be harder to understand the former. And as the complexity of the expression increases, I only see the advantage increasing typically (though often it pays to split it into multiple comprehensions, just like a loop that does too much).
Personally? Yes (except for the first example you gave, which I don’t classify as “list comprehension”).
It’s not inherent complexity though, just personal preference. I grew up writing for loops so they’re second nature to me and I grok them instantly in a single pass, whereas some list comprehensions require a re-read (particularly if they’re nested).
You are right, c# does too much. But Go makes it far more work to do basic things - list comprehension for example (what is everyones obsession with for loops?). An opinated language with one way to do things sounds great, but not at the expense of basic niceities you get in other languages.