본문 바로가기

Go/[Go]Make Packages

패키지 만들기

Package를 만듦으로써 어떠한 이점을 얻을 수 있을까요?

  • 프로그램이 복잡해지고 커질수록 가독성은 점차 안좋아질 수 있습니다. Package를 만듦으로써 코드의 가독성을 높일 수 있습니다.
  • 연관된 코드들을 한 곳에 모아 사용하기에 생산성에 이점이 있습니다.
  • 프로그램뿐만 아니라, 다른 개발자들과 함께 코드를 쉽게 공유할 수 있습니다.

이와 같은 이점이 존재하기 때문에 패키지를 만드는 것을 알 필요가 있습니다.

따라서, 해당 카테고리에서는 패키지를 어떻게 만드는지에 대해 말씀드리고자 합니다.

 

패키지 Code는 Go WorkSpace 디렉토리에 위치합니다.

앞으로 실습할 내용의 디렉토리 경로

src에서 각 패키지 코드는 하위 디렉토리에 위치합니다. 각 하위 디렉토리의 파일명은 보통 패키지 이름과 동일하게 지정합니다. 해당 내용을 숙지하고 이제부터 패키지를 만드는 실습을 진행하겠습니다.

 

패키지 만들기

필자가 진행할 실습 내용은 간단하게 필자의 닉네임과 나이를 출력하는 패키지를 만들어보고자 합니다.

GOROOT 작업공간 디렉토리
우선, workspace는 Go를 설치할 때 자동으로 생성되지 않기 때문에 다음과 같이 Go workspace를 따로 지정하여 시스템 변수로 세팅해주어야 합니다.
devhsops 패키지 경로
환경 변수를 설정하였다면, 지정한 경로 중 src 디렉토리의 하위 디렉토리로 devhsops라는 디렉토리를 만들어 devhsops.go 파일을 세팅해줍니다.

devhsops.go 파일의 코드는 다음과 같습니다.
package devhsops

import "fmt"

func Nickname() {
	fmt.Println("My Nickname is devhsops!")
}

func FindAge() {
	fmt.Println("I am 25 years old!")
}​

기존 package main과 다른 점
- 기존 프로그램을 실행하기 위해서 pack main을 사용했지만, 패키지 코드를 작성하기 위해서는 해당파일이 존재하는 디렉토리의 이름을 패키지 명으로 지정해줍니다.
- 모든 함수들의 첫글자는 대문자로 시작하는 것이 좋습니다. 외부에서 해당 패키지를 사용할 것이므로 공유할 수 있게끔 모두 대문자로 시작한 함수를 작성하였습니다.

이후 main.go 파일을 만들어 "devhsops" 패키지를 가져와 사용할 수 있습니다.

main.go 파일의 코드는 다음과 같습니다.
package main

import "devhsops"

func main() {
	devhsops.Nickname()
	devhsops.FindAge()
}​
위 코드와 같이 필자가 직접 정의한 패키지를 가져와 사용할 수 있습니다.

해당 코드의 결과값은 다음과 같습니다.
user define package example

주의사항

다음과 같이 패키지를 구성하게 된다면 실패할 수 있습니다.
1. devhsops 디렉토리 이름 변경
-> Go tool은 임포트 경로에 있는 이름을 package <디렉토리이름>으로 사용하기 때문에 이름이 일치하지 않으면 패키지 코드를 가져올 수 없습니다.

2. devhsops.go 패키지명 변경
-> 1번의 이유와 동일합니다.

3. 함수명을 소문자로 변경
-> 다른 패키지에서 함수를 사용하기 위해서는 첫번째 글자를 대문자로 설정하여야 외부와 코드를 공유할 수 있습니다.

+a 만약 "go.mod file not found in current directory or any parent directory" 라는 에러가 발생가 발생하거나, go get 명령어를 했음에도 불구하고 디렉토리가 정상적으로 GOPATH/src에 파일을 가져오지 못하게 된다면


"go env -w GO111MODULE=auto"라는 명령어로 해결하거나,

GOPATH가 제대로 설정되어 있는지 확인하여 정상적으로 세팅해주시면 됩니다.

관련 정보는 아래 링크를 통해 확인하시길 추천합니다.
https://velog.io/@kimmachinegun/Go-Go-Modules-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0-7cjn4soifk

 

[Go] Go Modules 살펴보기

Go 1.11에서 추가된 Go Modules에 대해 알아봅니다.

velog.io