Tutorial: Go 모듈 만들기

Tutorial: Go 모듈 만들기

Go로 코드를 작성하다 보면 "이 기능을 다른 모듈에서도 재사용하고 싶다"는 순간이 와요. 이 튜토리얼에서는 다른 모듈이나 앱이 import 해 쓸 수 있는 라이브러리 모듈을 직접 만들어 보고, 그걸 호출하는 앱을 연결해 봐요. 함수·에러 처리·슬라이스·맵·테스트까지 일곱 개의 짧은 주제로 Go 언어의 핵심 부분을 골고루 만지게 돼요.

출처: Tutorial: Create a Go module

남이 쓸 수 있는 모듈 시작하기

Go 코드는 패키지(package)로 묶이고, 패키지는 다시 모듈(module)로 묶여요. 모듈은 코드를 돌아가게 하는 데 필요한 의존성(Go 버전과 요구하는 다른 모듈들)을 명시해요. 모듈을 만들기 위해 greetings 디렉터리를 만들고 go mod init으로 시작해요.

mkdir greetings
cd greetings

모듈 경로는 여기서 example.com/greetings로 잡을게요. 배포할 모듈이라면 이것은 Go 도구가 내려받을 수 있는 경로, 즉 코드 저장소 위치여야 해요.

$ go mod init example.com/greetings
go: creating new go.mod: module example.com/greetings

go.mod에는 지금은 모듈 이름과 Go 버전만 들어 있어요. 의존성이 늘어나면 그 버전들이 이 파일에 쌓여서, 빌드를 재현 가능하게 하고 어떤 모듈 버전을 쓸지 직접 통제할 수 있게 해 줘요.

첫 번째 함수 작성하기

greetings.go 파일을 만들고 다음 코드를 넣어요. 이름을 받아 인사말을 만들어 돌려주는 Hello 함수예요.

package greetings

import "fmt"

// Hello returns a greeting for the named person.
func Hello(name string) string {
    // Return a greeting that embeds the name in a message.
    message := fmt.Sprintf("Hi, %v. Welcome!", name)
    return message
}

여기서 눈여겨볼 점은 함수 이름이 대문자 Hello로 시작한다는 것이에요. Go에서 대문자로 시작하는 이름은 패키지 밖에서도 호출할 수 있는 exported name이 돼요. fmt.Sprintf는 첫 번째 인자의 포맷 문자열에서 %v 자리에 name 값을 넣어 메시지를 만들어 주고, :=는 변수를 선언·초기화하는 축약 표기예요. 길게 쓰면 var message string + message = ... 두 줄이 돼요.

다음 단계로 이 모듈을 다른 모듈에서 import 해 호출해 볼게요 (call-module-code). 이렇게 하면 내가 만든 코드가 다른 앱에서 실제로 쓰이는 흐름을 직접 확인할 수 있어요.

더 알아보기