본문 바로가기

Language/Go

[Go] Go 사용하기(코드 구조, package)

한 언어를 제대로 사용하려면 역시 구조를 정확히 알아야한다. 공식 문서를 토대로 알아보자

 

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 위치

ORM gorm 패키지의 go.mod 파일

 

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로 생성한 실행가능한 커맨드파일이 존재한다

bin폴더에 존재하는 웹어플리케이션

 

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 번역문서