2011-09-06
2009-11-19
■[Golang]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);
}
}
■[Golang]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に書けば出来上がり。
クライアントも同じようにいけそうだなーたのしいなー
参考
2009-11-12
■[go]GO
D言語っぽさを感じたのは僕だけだろうか。
ついき
ちょっと前にはhttpのtestにこけてたけどrelease外してcloneしてみたらtest通った
hg clone https://go.googlecode.com/hg/ $GOROOT
追記の追記
Makeの仕組みが用意されてて嬉しかった。GOFILES並べるだけ。
include $(GOROOT)/src/Make.$(GOARCH)
TARG=hello
GOFILES=\
hello.go
include $(GOROOT)/src/Make.cmd
httpつかってみた
package main
import (
"fmt";
"http";
)
func main() {
if res, _, err := http.Get("http://www.google.com/"); err == nil {
for key, value := range res.Header {
fmt.Printf("%s: %s\n", key, value);
}
}
}
うごいた
goroutine使ってみた
package main
import (
"fmt";
"time";
)
func generate(ch chan string) {
for i := 0; ; i++ {
ch <- fmt.Sprintf("hogehogeurl%d", i);
}
}
func download(in, out chan string) {
for {
prime := <-in;
fmt.Printf("download: %s\n", prime);
out <- "ok";
time.Sleep(1 * 1e9);
}
}
func main() {
in := make(chan string);
out := make(chan string);
go generate(in);
for i := 0; i < 3; i++ {
go download(in, out);
}
for i := 0; i < 20; i++ {
<-out;
}
}
これは楽しい
2009-10-12
■[Mac]Snow Leopardやめた
なにかと不便なことが多かったからLeopardに戻した

