about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-02-06T16·59+0000
committerWilliam Carroll <wpcarro@gmail.com>2020-02-06T16·59+0000
commita91d00fd94817453c0be43b87d722153cc35c03d (patch)
treee0cf079a5dbd91ee3ac42a070e0e171054ff45bd
parent5df3bb4e40c039b1736627be36515d18a38638b6 (diff)
Host go directory for some go scratch work
actors.go is my attempt to better understand golang's channels. I'm mapping my
understanding of concurrency from my experience with Elixir / Erlang and actors
onto golang until I have more opinions.
-rw-r--r--go/actors.go45
1 files changed, 45 insertions, 0 deletions
diff --git a/go/actors.go b/go/actors.go
new file mode 100644
index 000000000000..1409db185e84
--- /dev/null
+++ b/go/actors.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+)
+
+// Call function `f` in a go-routine, passing a reference to a newly created
+// channel, `c`, as its only argument. Return a reference to `c` to the caller
+// of `act`. When `f` halts, close the channel.
+func act(f func(chan interface{})) chan interface{} {
+	c := make(chan interface{})
+
+	go func() {
+		defer close(c)
+		f(c)
+	}()
+
+	return c
+}
+
+func prompt(msg string) string {
+	reader := bufio.NewReader(os.Stdin)
+	fmt.Print(msg)
+	text, _ := reader.ReadString('\n')
+	// TODO: Trim trailing newline from the rhs of text.
+	return text
+}
+
+func main() {
+	c := act(func(c chan interface{}) {
+		for {
+			x := <-c
+			fmt.Printf("[A] Received value: %v\n", x)
+
+		}
+	})
+
+	for {
+		x := prompt("[B] Enter a value: ")
+		c <- x
+	}
+	os.Exit(0)
+}