diff options
author | Nat Lasseter <user@4574.co.uk> | 2019-05-28 15:38:15 +0100 |
---|---|---|
committer | Nat Lasseter <user@4574.co.uk> | 2019-05-28 15:38:15 +0100 |
commit | 82e3e6660f13bcc260e73a92225e1fa0a3c3f8ed (patch) | |
tree | 6bad238301300b8a8ea6a054516282b830741eb0 | |
parent | a918f9b462b8966620d699d40a9072dcd2f5d3c7 (diff) |
Another example becoming, more complex
-rw-r--r-- | becomings/fib.go | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/becomings/fib.go b/becomings/fib.go new file mode 100644 index 0000000..c1e9958 --- /dev/null +++ b/becomings/fib.go @@ -0,0 +1,53 @@ +package main + +import ( + "fmt" + "net" + "os" + "strconv" + "sync" +) + +const ( + LISTEN = "localhost:3334" +) + +type becoming struct { + Fibmutex sync.Mutex + Last [2]int +} + +func (b *becoming) Become() { + b.Last = [2]int{0, 0} + l, err := net.Listen("tcp", LISTEN) + if err != nil { + fmt.Println("Error listening: ", err.Error()) + os.Exit(1) + } + defer l.Close() + for { + conn, err := l.Accept() + if err != nil { + fmt.Println("Error accepting: ", err.Error()) + } else { + go handleRequest(conn, b) + } + } +} + +func handleRequest(conn net.Conn, b *becoming) { + defer conn.Close() + b.Fibmutex.Lock() + defer b.Fibmutex.Unlock() + if b.Last == [2]int{0, 0} { + conn.Write([]byte(strconv.Itoa(0))) + b.Last[1] = 1 + } else { + conn.Write([]byte(strconv.Itoa(b.Last[1]))) + sum := b.Last[0] + b.Last[1] + b.Last[0] = b.Last[1] + b.Last[1] = sum + } +} + +var Become becoming |