한 언어를 제대로 사용하려면 역시 구조를 정확히 알아야한다. 공식 문서를 토대로 알아보자
Code Organization
- go 프로그램은 package로 구성되어 있으며, 같은 패키지내의 어떤 소스 파일에 정의된 function, type, variable, constant는 어디서든 사용(visible)가능
* package : A package is a collection of source files in the same directory that are compiled together(같은 폴더에 있는 소스파일)
- repository는 1개 이상의 모듈로 구성됨. 루트 폴더에 go.mod 파일에 패키지나 모듈의 상세정보를 기술
* module : A module is a collection of related Go packages that are released together. (같이 배포되는 Go package 들의 집합)
- 모듈의 경로는 패키지의 import path 뿐만 아니라, 다운로드 받는 저장소의 위치를 가리킴
* github/com/user/someproject --> 저장소의 위치 + 실제 import path 위치
Workspace
- Go 프로그래머들은 모든 Go 코드를 단일 workspace에서 관리
- 하나의 workspace는 여러 버전관리저장소 포함 (여러개의 프로젝트)
- workspace는 src, pkg, bin 3개의 디렉토리를 가지는 구조
* src: Go 소스파일들의 집합(일반적으로 src 하위 1개의 폴더 = 1개의프로젝트)
* pkg: 패키지 객체들 존재
* bin: 실행 가능한 커맨드파일 존재
- 간단하게 작업한 내 workspace의 디렉토리 구조
- src에 github.com 폴더에 go get으로 설치한 서드파티모듈들을 확인할 수 있다.
- bin 에서는 go build로 생성한 실행가능한 커맨드파일이 존재한다
Start First program
- 모듈 경로와 go.mod 파일을 생성하자 - 여기서 github.com/user/hello 자리에 모듈 이름을 작성해준다.
$ mkdir hello # Alternatively, clone it if it already exists in version control.
$ cd hello
$ go mod init github.com/user/hello
go: creating new go.mod: module github.com/user/hello
$ cat go.mod
module github.com/user/hello
go 1.13
$
- 실행가능 소스파일은 package main으로 실행 해주어야한다.
- 아래의 go tool로 프로그램을 설치한다.
$ go install github.com/user/hello
- 저렇게 빌드하게 되면, 실행가능한 바이너리를 생성하게 되고, $HOME/go/bin/hello 에 binary 파일을 생성(install)한다.
- GOBIN 환경변수를 설정해서 binary 파일이 생성(install)되는 폴더를 바꿀 수 있다. (https://golang.org/cmd/go/#hdr-Environment_variables)
- source control system을 사용하는 경우, go.mod 파일과 소스파일(*.go)을 remote repository에 push 해주면 외부에서 import 할 수 있다. 아래와 같은 방식으로 remote 혹은 내 모듈의 package 모듈을 import 할 수 있다.
package main
import (
"fmt"
"github.com/user/hello/morestrings"
"github.com/google/go-cmp/cmp"
)
func main() {
fmt.Println(morestrings.ReverseRunes("!oG , olleH"))
fmt.Println(cmp.Diff("Hello World", "Hello Go"))
}
Testing
- go test 커맨드와 testing 패키지를 통해 테스트 프레임워크를 구성할 수 있다.
- 테스트를 위해 파일끝에 _test.go라는 파일과 그 내부에 TestXXX로 이름한 함수(func (t *testing.T))를 작성한다.
- testframwork는 각각 함수마다 실행되고, t.Error이나 t.Fail 함수를 call하면 테스트에 실패한것으로 간주한다.
- morestrings 패키지에 reverse_test.go 파일을 생성하고 go test를 실행하여 테스트 작업을 진행해보자.
package morestrings
import "testing"
func TestReverseRunes(t *testing.T) {
cases := []struct {
in, want string
}{
{"Hello, world", "dlrow ,olleH"},
{"Hello, 世界", "界世 ,olleH"},
{"", ""},
}
for _, c := range cases {
got := ReverseRunes(c.in)
if got != c.want {
t.Errorf("ReverseRunes(%q) == %q, want %q", c.in, got, c.want)
}
}
}
$ go test
PASS
ok github.com/user/morestrings 0.165s
$
** reference
https://golang.org/doc/code.html : golang 공식문서
https://github.com/golang-kr/golang-doc/wiki/Go-%EC%BD%94%EB%93%9C%EB%A5%BC-%EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95 golang-kr 번역문서
'Language > Go' 카테고리의 다른 글
[Go] 이미지 업로드 + naver cloud platform OCR 써보기 (0) | 2020.02.25 |
---|---|
[Go] defer, panic, recover?? (1) | 2020.01.26 |
[Go] - web programming : postgresSQL연결, CRUD사용해보기 (1) | 2020.01.20 |
[Go] - web programming : csv, gob 패키지 다루기 (0) | 2020.01.20 |
[Go] - web programming : 상황 인지, XSS 공격 막기 (0) | 2020.01.16 |