go

vim-go 기본 템플릿 비활성화

vim-go가 언제부터인가 main.go 를 만들면 템플릿으로 fmt.Println(“vim-go”) 를 찍어주는 코드를 자동으로 생성해 주기 시작했다. 나는 아무것도 나오지 않기를 바랬는데, 이런게 나와서 매번 지우는 작업을 하는게 싫었다. 그래서 설정중에 go_template_autocreate 를 조절했다. let g:go_template_autocreate = 0 와 같이 하면 이제 아무것도 없는 빈 화면이 나온다. 혹시라도 반복적으로 나오는게 좋은데 “vim-go"를 찍는게 아닌 특정한 코드가 필요하다면, “.vim/bundle/vim-go/templates/hello_world.go” 파일을 수정해도 된다. 또는 특정한 템플릿을 지정하고 싶다면, 다음과 같이, let g:go_template_file = "hello_world.go" 로 해도 된다.

template을 생성할때 왜 이름을 지정할까?

Go언어의 Template 엔진을 사용할때, 왜 New()의 파라미터로 이름을 만들어서 넘겨야 하는지가 궁금했었다. Template and Associated templates라는 글을 읽고 어느 정도 이해를 하게 되었다. 다음은 위 글의 내용을 요약한 것이다. template.New() 로 template을 만들때, 이름을 정해서 만든다. 이 때 FuncMap과 템플릿 리스트를 갖는 그룹(그룹의 이 글에서 사용하는 용어로 Associated Templates를 가르킨다)이 생성된다. FuncMap에 대해서는, https://golang.org/pkg/html/template/#FuncMap http://goinbigdata.com/example-of-using-templates-in-golang/ http://technosophos.com/2013/11/23/using-custom-template-functions-in-go.html 를 확인해본다. New()를 했어도 아직 템플릿 리스트에서 관리되는 대상은 아니다. Parse(…)를 하면 템플릿 리스트에 추가가 된다.

css와 같은 정적 컨텐츠를 html에서 사용하기 위한 팁

Go의 “net/http"와 “html/template"를 이용해서 html과 css로 만들어진 웹페이지를 만들려고 할때, html 파일이 보여질때 css가 적용되지 않은 상태로 보여진다. 이 때 어떻게 해야 하는지 방법을 찾아가던 과정을 기록으로 남겨 놓는다. 프로젝트의 디렉토리 구조는 다음과 같다. src\ + prj + main.go + static style.css + template index.html 그래서 이렇게… func main() { http.HandleFunc("/", indexHandler) http.ListenAndServe(":8080", nil) } func indexHandler(...) { // index.html } 와 같이 하면 될 줄 알았다. 그런데 안된다. 그래서 어떻게 해야 하는지 찾아보니, FileServer로 css파일을 제공해 주면 된다고 한다.

http 패키지의 HandleFunc과 Handle

HandleFunc http.ResponseWriter 와 *http.Request를 인자로 받는 함수를 전달받는다. 내부적으로 ServeHTTP가 구현된 ServeMux를 사용한다. package main import ( "net/http" ) func indexHandler(w http.ResponseWriter, r *http.Request) { .... } func main() { http.HandleFunc("/", indexHandler) http.ListenAndServe(":8080", nil) } Handle http.Handler 인터페이스를 구현한 객체를 전달받는다. 인자로 전달받은 객체는 http.Handler의 ServeHTTP(http.ResponseWriter, *http.Request)가 구현되어 있어야 한다. package main import ( "net/http" ) type indexHandler struct { } func (index *AppHandler) ServeHTTP(w http.ResponseWriter, r *http.

vendor 사용 팁(내부 패키지)

프로젝트 내부에서 별도의 패키지를 만들어서 사용을 하려고 할때면, import 경로를 “github.com/blah/project/internalpkg” 처럼 다 써야 했었다. 이제 vendor를 사용하면 pkg 이름만 import 해서 사용할 수 있게 되었다. 샘플 프로젝트는 다음과 같다. https://github.com/sabzil/lotto 샘플 프로젝트에 대해서 약간의 설명을 더하면, 기존에는 command 패키지를 commands.go 에서 import 하기 위해서, import “github.com/sabzil/lotto/command” 와 같이 사용해야 했었다. 이렇게 되면 lotto 프로젝트를 다른 사람이 fork 해서 사용하려고 하면 일일이 import 경로를 변경해줘야 하는 문제가 생기게 된다. 그래서 go1.

pkg 원격저장소 연결하기

최근에 go소스들을 분석하면서 특이한 pkg import 경로들을 보게되었다. import "rsc.io/pdf" 와 같은 “github.com/rsc/pdf” 와 동일한 내용인데 그리고 rsc는 russ cox가 사용하는 닉네임인데…그럼 같은 pkg인가? 그래서 웹브라우저에서 rsc.io/pdf 를 입력하면 godoc로 이동을 하네? 어떻게 한걸까!? 궁금했다. 그리고 왠지 멋있어 보였다…; 그러다가 우연히 rob pike의 github page(https://github.com/robpike/robpike.github.io)를 보게 되었다. index.html 에 이렇게만 코드가 되어 있었다. <meta name="go-import" content="robpike.io/cmd hg https://code.google.com/p/rspace.cmd"> This is a git repository holding a redirect for the Go repositories referenced by robpike.

pkg-config 사용

Go언어를 사용하다보면 C로 만들어진 라이브러리를 사용하기 위해서 cgo가 필요할 때 가 있다. 라이브러리를 링크하고 하는 몇 가지 절차를 거치게 되는데, 이때 pkg-config라는걸 사용하면 편리하다. pkg-config를 사용하면 컴파일하는데 필요한 라이브러리와 헤더정보를 Go코드상에서 동일한 경로로 제공해줄 수 있게 된다. pkg-config가 설치되어 있지 않을 경우에는 다음과 같이 설치를 해준다. $ sudo apt-get install pkg-config 이제 설치되어 있는 라이브러리 목록을 한번 보자. $ pkg-config --list-all 현재 설치된 라이브러리들의 정보가 나오게 된다. 그런데 내가 원하는 라이브러리의 정보가 나타나지 않는다.

Golang channels tutorial

최근에 goroutine과 channel에 대해서 학습하다가 설명이 잘 되어 있는 글을 찾아서 번역(이라고 하기에는 뭐하고 정리?) 를 해봤다. 제대로 이해를 못하고 잘 못 번역을 한 부분이 있을 수 도 있으니…꼭 원본을 보길 권장한다.;;; 원본 : http://guzalexander.com/2013/12/06/golang-channels-tutorial.html Go언어는 병렬 프로그램 작성을 위해서 내장 도구를 갖고 있다. go를 함수 호출 앞에 놓으면 동일한 주소에 위치하는 코드를 독립적인 병렬 스레드로 실행을 시작한다. 이런 쓰레드를 Go언어에서는 goroutine이라고 부른다. 여기에서 말하는 concurrently는 parallel을 의미하지는 않는다. (역주: 그렇지만 번역은 “병렬” 이라고 칭하겠다.

md5 패키지 사용예

Qt로 만드는 클라이언트에서 이미지 파일에 대해서 만들어진 md5 hash를 검증 해보기 위해서, 같은 이미지 파일에 대해서 Go언어로 md5 hash를 만들었을때 동일한 값이 생성되면 제대로 만들어진거 아닐까 해서, 만들어 봄. (사실은 일하기 싫어서 괜히 한번 해 본…) package main import ( "io/ioutil" "crypto/md5" "fmt" ) func main() { data, err := ioutil.ReadFile("1.jpg") if err != nil { return; } hash := md5.New() hash.Write(data) hashData := hash.Sum(nil) fmt.Printf("%x", hashData) }

C언어의 배열을 Go언어의 slices로 변환

cgo를 이용하다보면, C언어로 작성된 라이브러리의 리턴값으로 포인터에 구조체가 할당되어서 넘어올때가 있다. C언어에서 넘어오는 구조체 배열이 포인터 형태로 넘어오니, Go의 포인터에 할당을 해서 사용 해봤다. 당연히 제대로 동작하지 않는다. C언어로 작성된 라이브러리에서 넘어오는 값은 배열이니, Go언어에서는 slices에 할당을 하는게 맞는것 같다. 다음의 내용을 보면, array를 어떻게 slices에 할당을 해야 할지에 대해서 잘 설명이 되어 있다. “Turning C arrays into Go slcies” ( https://code.google.com/p/go-wiki/wiki/cgo ) 아래는 cubrid driver를 만들면서 사용한 코드이다. slcieHeader := (*reflect.