Go | sabzil

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가 없기 때문에… 그러다 조금더 찾아보니… https://github.com/golang/go/issues/5375 와 같은 이슈가 있는데… ... 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.SliceHeader)(unsafe.Pointer(&go_col_info))) sliceHeader. ... Read more

September 3, 2013

type으로 이름 붙여진 구조체의 필드를 사용하기위한 방법

go
c로 만들어져 있던 라이브러리를 cgo를 이용해서 포팅(?)을 하는 작업을 하다보면 난감한 부분들이 종종 나타난다. 그중에 한가지가 c에서 사용하던 구조체의 파라미터명이 go 에서 미리정의된 명칭일 경우가 있다. 대표적인 예로 “type”이라는 파라미터명이다. c에서는 T_CCI_COL_INFO(cubrid의 cci에서 사용되는 구조체중에 하나) 의 필드중에 하나가 type이라는 필드가 하나 있다. 이걸 go에서 사용을 하려고 하니,,, “…expected selector or type assertion, found ‘type’ ” 이라는 결과를 만나게 된다. 이걸 도대체 어떻게 사용해야 하나 고민을 하던중, golang.org 에 있는 문서 “http://golang. ... Read more

August 23, 2013

패키지 만들때 유닛테스트 사용하기

go
Go 언어용 패키지를 만들려면, 유닛테스트(?) 를 해야 개발이 진행이 좀 더 빨라지는것 같다. 그래서 정리를 해봤다. abc 패키지를 만들어서 테스트하기… src\abc\abc.go src\abc\abc_test.go 와 같이 파일을 만들어 놓는다… abc.go의 내용은… package abc import ( "fmt" ) func A_Method() { fmt.Println("test A Method") } 그리고 abc_test.go 의 내용은 package abc import ( "testing" ) func TestA_Method(t *testing.T) { A_Method() } 와 같이 한 후에 src\abc\ 에서 go test를 하면 테스트가 진행이 된다. ... Read more

August 23, 2013

Channel에 대한 학습

go
http://golangtutorials.blogspot.kr/2011/06/channels-in-go.html 에 있는 내용의 요약 goroutine에 값을 던져주고 받는 방법으로 이용한다. 크기를 지정할 수 있다. channel을 정의할때는 chan이라는 키워드를 사용하고 make를 통해서 만든다. channel 변수 이름 앞과 뒤에 <- p=“”>- make로 만들때 단방향 channel을 만들 수 있다. channel을 이용해서 동기화를 한다. 어떤 크기의 channel이면 그게 다 채워지면, 받는쪽에서 channel에서 받을 수 있다. -

© sabzil 2016