Rath World » go

Archive

Posts Tagged ‘go’

Google이 발표한 새로운 시스템 프로그래밍 언어 Go 써보기

November 13th, 2009 7 comments

구글이 새로운 시스템 프로그래밍 언어인 Go를 발표했습니다.

이것이 무엇인가.. 에 대한 글은 인터넷에 마구마구 퍼져있으니 찾아보시면 되고요, 어제 Google Go를 보고 제가 미투데이에 남겼던 기록들은 여기에서 볼 수 있습니다.

안타깝게도 release revision의 json 모듈에 버그가 있어서 2시간정도 삽질을 했습니다. 그것이 버그인지 감별하는데 대부분의 시간을 보냈고, 실제로 버그를 고치는데는 30분 정도가 걸린 듯 하네요.

$GOROOT/src/pkg/json/parse.go 에서 유니코드 문자열 처리를 위해 \u를 만났을때 다음 4바이트를 읽어 int로 변환하는 _UnHex 펑션에서 start, end offset을 받게 해놓고, caller는 start, length를 불러서 생긴 어처구니 없는 버그였습니다. 영광스럽게 패치를 보내려고 하니.. current revision에는 이미 고쳐있지 뭐에요. 별 수 있나요. 울었습니다.

문법에 익숙해지는데 꽤 시간이 걸렸지만, 깔끔합니다.

시험삼아 미투데이에서 내게 달린 최근 댓글을 확인하는 콘솔 프로그램을 만들어보며 학습을 했는데, make 파일과 me2comment.go 파일을 한 번 둘러보시지요.

* Makefile

1 include $(GOROOT)/src/Make.$(GOARCH)
2
3 TARG=me2comment
4 GOFILES=\
5     me2comment.go\
6
7 include $(GOROOT)/src/Make.cmd

* me2comment.go

 1 package main
 2
 3 import (
 4     "io";
 5     "http";
 6     "json";
 7     "fmt";
 8     "regexp";
 9     "flag";
10 )
11
12
13 func filter_html(str string) string {
14     remove_anchor := regexp.MustCompile("<[^>]+>");
15     var s string = remove_anchor.ReplaceAllString(str, "");
16     s = regexp.MustCompile("&lt;").ReplaceAllString(s, "<");
17     s = regexp.MustCompile("&gt;").ReplaceAllString(s, ">");
18     return s;
19 }
20
21 func main() {
22     var username string;
23     flag.StringVar(&username, "username", "rath", "Your ID of the me2DAY.");
24     flag.Parse();
25
26     url := fmt.Sprintf("http://me2day.net/api/track_comments/%s.json", username);
27     r, _, err := http.Get(url);
28     if err!=nil {
29         fmt.Printf("Error: %v\n", err);
30         return;
31     }
32
33     buf, err := io.ReadAll(r.Body);
34     ret, ok, errtok := json.StringToJson(string(buf));  
35     if !ok {
36         fmt.Printf("Error: %v\n", errtok);
37     } else {
38         to_me := ret.Get("comment_to_mes");
39         var last_post string = "";
40         for i:=0; i<to_me.Len(); i++ {
41             e := to_me.Elem(i);
42
43             nickname := json.Walk(e, "comment/author/nickname");
44             body := filter_html(json.Walk(e, "comment/body").String());
45             post_body := filter_html(json.Walk(e, "post/body").String());
46
47             if post_body!=last_post {
48                 var to_print string = post_body;
49                 if len(post_body)>50 {
50                     to_print = post_body[0:50]
51                 }
52                 fmt.Printf("* %s\n", to_print);
53             }
54             fmt.Printf("   ㄴ%s: %s\n", nickname, body);
55             last_post = post_body;
56         }
57     }
58
59     r.Body.Close();
60 }

실행시키면 ..


Jang-Ho-Hwangs-iMac:tmp rath$ ./me2comment
* 그녀의 요리 실력은 나날이 업그레이?
   ㄴ2Z[이지]: 영국이라는 게 믿기지 않아요! @.@
   ㄴJB♥: 와웅 보쌈코기 같이생겼어용ㅋㅋ뭔가맛나보이는 덮밥입니다ㅋㅋ
   ㄴ바람달: 하앍
   ㄴK-Dog: 크아!!
   ㄴtomato: 소스는 없이 먹는건가요?
* $GOROOT/src/pkg/json/parse.go 에서 \u를 만났?
   ㄴ솥아: 난 왜 최신 언어들에는 관심이 없는걸까 -.-  [글보러가기]
* 그녀의 요리 실력은 나날이 업그레이?
   ㄴ_wonhui: 맛있어 보입니다 -ㅁ-
* $GOROOT/src/pkg/json/parse.go 에서 \u를 만났?
   ㄴK-Dog: 꺅 더 좋은 세상을 위해 애쓰시는군요
   ㄴ다즐링: 이 님하 고고씽 삼매경.. ㅠㅠ 이러지마셈 흑흑..
* 버그 찾았다 >_< 2글자만 더 입력하면 ?
   ㄴgyedo: 역시 고수 ^^b
* $GOROOT/src/pkg/json/parse.go 에서 \u를 만났?
   ㄴgyedo: 보통 버그들이 ^^ 어처구니 없죠, 근데 current에는 고쳤다니 기특한걸요
* 밤에 집중이 잘 되는 나. 런던은 요새
   ㄴ늘보: 헉 ㅋㅋ 전 생산성이 떨어져요. 해가 지고나면 졸려서 ㅋㅋ
   ㄴ루치아: 컨디션 안 좋으면 쉬면서 해야죠 ㅎㅎ

이렇게 최근 내게 달린 댓글을 출력해주는 간단한 프로그램입니다.

go가 의존성을 모두 날려버리고 하나의 binary로 만들어주는 기특한 녀석이기 때문에, 이런 간단한 프로그램의 바이너리가 1.2MB나 된답니다. (darwin/amd64 빌드임)

만만한게 미투데이라 ^_^ 시스템 프로그래밍과 전혀 무관한 미투데이 클라이언트를 만들어보았는데요, 다음에 기회가 되면 go의 자랑 기능인 동시성 지원부분을 써보고 싶네요.

Categories: Daily, Development Tags: , ,