Hatena::ブログ(Diary)

GIOの日記 RSSフィード

2009-11-19

[]Goイテレータ

goroutineとchannelとrangeつかえば巧い事やってくれました。

package main

import (
    "log";
    "time";
)

func FibIter(n int) chan uint64 {
    ch := make(chan uint64);
    go func() {
        var a, b uint64 = 0, 1;
        for i := 0; i < n; i++ {
            ch <- a;
            a, b = b, a + b;
        }
        close(ch);
    }();
    return ch;
}

func main() {
    for i := range FibIter(50) {
        log.Stdout(i);
        time.Sleep(1e8);
    }
}

[]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に書けば出来上がり。

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


参考

dustin/gomemcached ? GitHub