Goでサーバー実装のパターン

Go言語がおもしろい。
Goでのサーバー実装の方法が、ある程度パターン化してるので覚えておこう。
ここで言うサーバーはエコーサーバーやmemcachedみたいなやつデス

package main

import (
    "net";
    "fmt";
)

func handler(conn net.Conn) {
    defer conn.Close();

    // 4
    buf := make([]byte, 16);
    l, err := conn.Read(buf);
    if err == nil {
        conn.Write(buf[0:l]);
    }
}

func main() {
    sock, err := net.Listen("tcp", "127.0.0.1:1983");
    if err != nil {
        fmt.Printf("error %s", err);
        return;
    }

    // 1
    for {
        // 2
        conn, err := sock.Accept();
        if err != nil {
            fmt.Printf("error %s", err);
            return;
        }
        // 3
        go handler(conn);
    }
}

1でループし、2でAccept。そして3でコネクションをgoroutineで動かしたhandlerに渡す。
最後にロジックを4に書けば出来上がり。

クライアントも同じようにいけそうだなーたのしいなー


参考
GitHub - dustin/gomemcached: A memcached binary protocol toolkit for go.