右上➚

プログラミングに関するメモをのこしていきます

Golangでechoサーバ

最近 golang が気になります
golang の特徴はもはやわざわざここに書くまでも無いことだと思うので書きませんが, 気になっている理由を書いてみます.

  • バイナリ(しかもポータビリティが非常に高いバイナリ)にコンパイルされること
  • C/C++ には及ばずとも実行が非常に速いこと
  • C/C++ ほど低レイヤーいじり放題なわけではないが, ある程度低レイヤーまで降りていけること
  • コマンドラインツールからWeb アプリケーションのような高レイヤーまで十分得意であること
  • interface による抽象化が, 過度でなく調度良く感じられること

こんな感じでしょうか.
Compiled Python っていう感じが非常に良さそうだなーと思っています.

というわけでHaskellに引き続き golang でも echo サーバを書いてみました

package main

import (
    "fmt"
    "io"
    "net"
)

func main() {
    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        panic(err)
    }
    for {
        conn, err := listener.Accept()
        if err != nil {
            panic(err)
        }
        go func(conn net.Conn) {
            defer conn.Close()
            echo(conn)
        }(conn)
    }
}

func echo(conn net.Conn) {
    buf := make([]byte, 256)
    for {
        n, err := conn.Read(buf)
        if err != nil {
            if err == io.EOF {
                break
            }
            panic(err)
        }
        if n == 0 {
            break
        }
        wn, err := conn.Write(buf[0:n])
        if err != nil {
            panic(err)
        }
        if wn != n {
            panic(fmt.Errorf("could not send all data"))
        }
    }
}

さすがは golang というかなんというか. ものすごく普通な空気を感じますね.
golangはこういう普通さが売りの1つだと思っています.