diff options
author | William Carroll <wpcarro@gmail.com> | 2020-02-06T16·59+0000 |
---|---|---|
committer | William Carroll <wpcarro@gmail.com> | 2020-02-06T16·59+0000 |
commit | a91d00fd94817453c0be43b87d722153cc35c03d (patch) | |
tree | e0cf079a5dbd91ee3ac42a070e0e171054ff45bd /go/actors.go | |
parent | 5df3bb4e40c039b1736627be36515d18a38638b6 (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/actors.go')
-rw-r--r-- | go/actors.go | 45 |
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) +} |