Go | sabzil's memorandum

September 3, 2016

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

go
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(…)를 하면 템플릿 리스트에 추가가 된다. ... Read more

July 18, 2016

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

go
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 } 와 같이 하면 될 줄 알았다. ... Read more

July 17, 2016

http 패키지의 HandleFunc과 Handle

go
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 ( " ... Read more

July 15, 2016

go get 이 실패하는 경우

go
go get을 시도했는데 실패를 한다. $ go get bitbucket.org/... 를 시도했는데, $ go get bitbucket.org/...: 403 FORBIDDEN 와 같은 결과가 보여진다. 찾아보니 동일한 경우가 있었다. https://groups.google.com/forum/#!topic/golang-nuts/li8J9a-Tbz0 해당 repository가 private일 경우에 나타나는 오류인거다. github의 경우, https://michaelheap.com/golang-how-to-go-get-private-repos/ 에 보면 $ git config --global url."git@github.com:".insteadOf "https://github.com/" $ cat ~/.gitconfig [url "git@github.com:"] insteadOf = https://github.com/ 와 같이 하는 방법이 있는것 같지만 github에 private한 respository가 없기 때문에…​ ... Read more

March 9, 2016

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. ... Read more

June 11, 2015

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. ... Read more

March 6, 2015

pkg-config 사용

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

December 10, 2014

Golang channels tutorial

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

October 8, 2013

md5 패키지 사용예

go
Qt로 만드는 클라이언트에서 이미지 파일에 대한 md5 hash를 만들었는데, 이게 맞는 값인지 검증을 해보기 위해서, Go언어로 만들어 낸 md5 hash와 동일하면 잘만들어진거 아닐까 해서, 만들어 봤습니다. (사실은 일하기 싫어서 괜히 한번 해본겁니다,,,;;;) package main import ( "io/ioutil" "crypto/md5" "fmt" ) func main() { data, err := ioutil.ReadFile("d:\\1.jpg") if err != nil { return; } hash := md5.New() hash.Write(data) hashData := hash.Sum(nil) fmt.Printf("%x", hashData) }

September 17, 2013

C 배열을 Go slices로 변환

go
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. ... Read more

© sabzil 2016