about summary refs log tree commit diff
path: root/go
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 /go
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.
Diffstat (limited to 'go')
-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)
+}