diff --git a/about_channels.go b/about_channels.go new file mode 100644 index 0000000..2ecd01f --- /dev/null +++ b/about_channels.go @@ -0,0 +1,27 @@ +package go_koans + +func aboutChannels() { + ch := make(chan string, 2) + + assert(len(ch) == __int__) // channels are like buffers + + ch<- "foo" // i mean, "metaphors are like similes" + + assert(len(ch) == __int__) // they can be queried for queued items + + assert(<-ch == __string__) // items can be popped out of them + + assert(len(ch) == __int__) // and len() always reflects the "current" queue status + + // the 'go' keyword runs a function-call in a new "goroutine" + // which executes "concurrently" with the calling "goroutine" + go func() { + // your code goes here + }() + + assert(__delete_me__) // we'll need to make room for the queue, or suffer deadlocks + + ch<- "bar" // this send will succeed + ch<- "quux" // there's enough room for this send too + ch<- "extra" // but the buffer only has two slots +} diff --git a/setup_koans_test.go b/setup_koans_test.go index 6cdcde6..6030246 100644 --- a/setup_koans_test.go +++ b/setup_koans_test.go @@ -33,6 +33,7 @@ func TestKoans(t *testing.T) { aboutPointers() aboutStructs() aboutAllocation() + aboutChannels() aboutConcurrency() aboutPanics()