Or abstracts away a tricky problem of synchronisation, it's all a matter of
perspective. Just the same way automatic memory management obfuscates the logic
behind memory allocations and freeing, channels obfuscate the logic behind
passing data between threads. But when the end goal is to do the
allocations/freeing or data passing correctly I don't need to know those
details, I just need it to work. And much the same way as Nim can switch the
garbage collector it would be possible to switch the channel implementation.
That's the beauty of abstraction.