From a91d00fd94817453c0be43b87d722153cc35c03d Mon Sep 17 00:00:00 2001 From: William Carroll Date: Thu, 6 Feb 2020 16:59:04 +0000 Subject: 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. --- go/actors.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 go/actors.go (limited to 'go/actors.go') 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) +} -- cgit 1.4.1