기본 콘텐츠로 건너뛰기

라벨이 golang인 게시물 표시

docker+alias를 사용해서 golang 편하게 쓰기

이 글은 docker 설치를 했다는 가정에서 진행한다. 먼저 go docker 버전을 가져오자 docker pull 해도 되지만 필요한 걸 추가할 수도 있을 것 같아 Dockerfile 을 만들었다. FROM golang:1.7-alpine go 1.7을 비교적 가벼운 alpine linux버전에 올리자. docker build . 해서 image를 만들자 docker images를 해서 확인할 수 있다. alpine 이 아니라 그냥 1.7도 docker pull golang:1.7 해서 가져와봤는데  $ docker images REPOSITORY                  TAG                 IMAGE ID            CREATED            SIZE golang                      1.7-alpine          52493611af1e        5 days ago          241.1 MB golang                      1.7                 fe25c00086fb        5 days ago     ...

go를 사용하여 Google App Engine에 정적 웹서버를 올려보자.

작년에 미뤄뒀던 Go 를 다시 보고 있다. 동기부여를 위해 회사 안내 홈페이지를 망할 일도 없고 비용이 안드는 곳으로 옮기고 싶은 생각이 있었는데 Google App Engine (이하 GAE)정도면 뭐 망할 일이 없겠지 싶다. Google Apps 처럼 유료화해도 먼저 만들어 놓은 서비스/계정은 안건드니까 먼저 침이라도 발라놓아야지. 개발환경 세팅은 간단했다. Download 에서 package 를 받고 설치한 다음 goide를 쓰고 싶었으나 아직 완성도 문제가 있어서 sublime을 사용하기로 결정. http://wbond.net/sublime_packages/package_control/installation 는 전에 설치해놓았다. 그저 sublime을 띄운 상태에서 ctrl+` (OS X에서도 ctrl+` 임)을 누르면 나타나는 하단 콘솔창에 import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation' 요 내용을 붙여넣으면 끝. 그 다음 sublime용 golang plugin인 GoSublime 을 추가 데모 동영상을 보면서 사용법을 간단하게 알아보면 0:11즈음에 나오는 package 삽입 기능은...

routing module을 만들자 - handler

callback을 바로 넣을 수는 없어보이고 type 에 func 을 정의하고 달면 된다. 나름 명시적이네. 역시 소스는  여기 package main import (   "fmt" ) type Handler func(method string) type Route struct {   Method,Pattern string } type Routes struct {   Routes []Route } func (r Routes) routeCount() int {   return len(r.Routes) } func (r *Routes) addRoute(method, pattern string,  handler Handler ) {   r.Routes=append(r.Routes, Route{Method:method, Pattern:pattern})   fmt.Printf("route Count : %d\n", len(r.Routes))    handler(method) } func (r *Routes) GET(pattern string,  handler Handler ) {   r.addRoute("GET", pattern, handler) } func (r *Routes) POST(pattern string,  handler Handler ) {   r.addRoute("POST", pattern, handler) } func (r *Routes) PUT(pattern string,  handler Handler ) {   r.addRoute("PUT", pattern, handler) } func (r *Routes) DELETE(pattern string,  handler Handler ) {   r.addRoute("DELETE", pattern, handler) } func handler(method...

routing module을 만들자 - REST 붙이기

별 중요한 건 없지만 역시 func (variable struct)를 쓰는 패턴을 학습한다. routeCount 를 구할땐 func(r Routes)를 addRoute, GET/POST/PUT/DELETE를 할땐 func(r *Routes) 를 쓰는 부분에 주목하자. 역시 소스는  여기 package main import (   "fmt" ) type Route struct {   Method,Pattern string } type Routes struct {   Routes []Route } func (r Routes) routeCount() int {   return len(r.Routes) } func (r *Routes) addRoute(method, pattern string) {   r.Routes=append(r.Routes, Route{Method:method, Pattern:pattern})   fmt.Printf("route Count : %d\n", len(r.Routes)) } func (r *Routes) GET(pattern string) {   r.addRoute("GET", pattern) } func (r *Routes) POST(pattern string) {   r.addRoute("POST", pattern) } func (r *Routes) PUT(pattern string) {   r.addRoute("PUT", pattern) } func (r *Routes) DELETE(pattern string) {   r.addRoute("DELETE", pattern) } func main() {   r:=new(Routes)   r.GET("/user/:user")   r.PUT("/add/:user")   r.PO...

go 공부 - struct에 대하여

routing module 을 만들기 위해 객체를 작성해야겠다는 생각이 들어 struct와 function을 보고 있다. 아무래도 나온지 2년이나 되었지만 인지도가 약해서인지 제대로 돌아가는 소스가 적다. 직접 해보고 오류 메시지를 보면서 학습할 수 밖에. go는 javascript 처럼 functional하기도 하고 prototypal 한 특성을 가지고 있다. function 을 이용하는 법을 보고 있는데 얼추 비슷하게 쓸 수 있겠다. http://golang.org/doc/ExpressivenessOfGo.pdf  중 21page 를 보면서 소스를 타이핑 해본다. 소스보기 package main import (   "fmt"   "math" ) type Point struct { x, y float64 } func (p Point) Abs() float64 {   return math.Sqrt(p.x*p.x + p.y*p.y) } func main() {   p:=Point{3,4}   fmt.Printf("%f", p.Abs()) } 객체를 생성할땐 pascal 타입의 선언자 := 를 써서 쓸 수도 있고 다른 언어들처럼 new를 써서 main부분을 바꿔보면. func main() {   p:=new(Point)   p.x = 3   p.y = 4   fmt.Printf("%f", p.Abs()) } 이런식으로 초기화 할 수도 있다. 아마도 javascript 로 쓰면 아래와 같을 것이다. var Point = function(arg) {   var x;   var y;   x=arg.x;   y=arg.y;   return {     Abs : function() {       return M...

go용 routing module을 만들고 있다.

ror/sinatra 나 express.js 처럼 우아한 routing쓰고 싶은데 연습삼아 만들어보자는 생각에 서툰 코딩을 시작 /user/:userid 인 경우 \/user\/([^\/]+)\/? 이런 식으로 우아하게 정규식 치환을 했으면 했는데 string 패키지도 좀 볼겸. 단순하게 문자열 조작+뺑뺑이로 구현했다. https://gist.github.com/1827639 package main import "fmt" import "strings" var routes = [] string {    "/user/:id/friends/:friendsId" ,    "/scrapbook/:scrapbookid/scrap/:scrapid" ,    "/" } func getParams ( url string ) map [ string ] string {    for idx , _ := range routes {      format := routes [ idx ]      urlToken := strings . Split ( url , "/" )      formatToken := strings . Split ( format , "/" )      /* match pattern */      if len ( urlToken )== len ( formatToken ) && len ( formatToken )> 0 {        params := make ( map [ string ] string )  ...