GoLang - 패키지 ( packge, import, GOROOT, GOPATH, go get, go mod, go doc )

dev_swan·2022년 11월 22일

Golang

목록 보기
6/9
post-thumbnail

패키지

Go의 패키지는 자바의 패키지와 비슷합니다. 모든 Go 코드는 특정 패키지에 포함되어야 합니다.

특수 패키지인 main을 제외하고는 모두 일반적인 패키지라고 보면 됩니다.


Hello, Go

package main

import "fmt"

func main() {
  frm.Println("Hello, Go!")
}

위의 코드는 main 패키지에 소속되어 있음을 볼 수 있습니다. main은 특수 패키지이며 프로그램의 메인 코드인 main() 함수가 정의되어 있으며 실행가능한 패키지임을 의미합니다.

이 패키지는 다른 코드에 의해 포함되는 용도로 존재하는 것이 아닌 프로그램을 실행하기 위해 존재합니다.

이렇듯 우리가 가장 처음에 작성했던 코드도 패키지에 소속되어 있는것을 볼 수 있는데, Go의 모든 코드는 어떠한 패키지 내부에 포함되어 있습니다.


내장 패키지는 어디에 위치하고 있을까?

Hello, Go의 코드를 보면 import 키워드를 사용하여 fmt 패키지를 포함하고 있는 것을 볼 수 있습니다.

이 패키지는 내장 패키지이며 go의 바이너리 파일이 있는 디렉토리의 상위 폴더를 보면 pkg, src 폴더가 있을텐데, src 폴더에 내장 패키지의 go 파일들이 있는것을 확인할 수 있습니다.

위에서 사용한 fmt 패키지도 디렉토리안에 위치한것을 확인할 수 있습니다.

src 폴더에는 내장 패키지가 들어있고, pkg 폴더에는 내장 패키지들이 컴파일 된것들이 들어있습니다.

따라서 우리는 내장 패키지가 위치하고 있는 src 폴더를 주목해야합니다.


GOROOT와 GOPATH 설정 ( zsh )

> vi ~/.zshrc

export GOPATH=$HOME/go
export GOROOT="$(brew --prefix golang)/libexec"
export PATH="$PATH:${GOPATH}/bin:${GOROOT}/bin"

> source ~/.zshrc
  • GOROOT : Go를 설치했을 때 Go 관련된 실행파일, SDK 등이 위치하는 곳
  • GOPATH : bin, pkg, src 폴더가 위치하는데 go get 명령어를 통해 받은 패키지나 라이브러리, 소스파일이 위치하는 곳

추후에 GOROOTGOPATH에 대해 자세히 알아볼 것이니 오늘은 간단히 세팅만 하도록 하겠습니다.

세팅을 완료하였다면 go env를 입력하여 GOROOTGOPATH가 잘 적용되었는지 확인합니다.


패키지 만들기

import 키워드를 사용하여 패키지를 불러올 때 go가 찾는 폴더의 앞에는 GOROOT/src 가 포함됩니다. 우리는 위에서 GOROOT 설정을 해주었으니 go env를 입력하여 GOROOT의 디렉토리에 있는 src 디렉토리에 가서 hello 패키지를 만들어줄 것입니다.

go env를 입력하면 위에서 설정한 다음과 같은 GOROOT의 경로를 확인할 수 있습니다.

GOROOT="/usr/local/opt/go/libexec"

해당 위치로 이동하여 src 디렉토리에서 hello 패키지를 만들어보도록 하겠습니다.

/** PATH=${GOROOT}/src/hello/hello.go */  

package hello

import "fmt"

func SayHello() {
  fmt.Println("Hello, Go!")
}

hello 패키지 안에서 Sayhello 함수를 만들때 대문자로 시작하는것을 확인할 수 있는데 Go에서는 함수, 변수, 상수, 구조체 등의 이름이 대문자가 아니라면 외부 패키지로 노출하지 않습니다.

즉, 소문자의 경우 캡슐화되어 내부 패키지에서만 사용할 수 있고 외부에서는 접근할 수 없습니다. Sayhello 함수는 외부에 있는 main 패키지에서 사용할 것이기 때문에 대문자로 함수를 만들어 주었습니다.

src 디렉토리에 hello 패키지를 생성했다면 외부에 있는 main 패키지에서 내장 패키지로 만들어준 hello 패키지를 불러와 아래와 같이 사용해보도록 합시다.

package main

import "hello"

func main() {
  /** -> Hello,Go! */
	hello.SayHello()
}

같은 패키지 내부에 있다면 파일이 여러개로 분리되어 있는것은 아무런 상관없습니다.


go get

go get을 통해서 다른 패키지를 다운받아 사용할 수 있습니다. 얻어온 패키지는 일반적으로 GOPATH로 다운로드 되며, GOPATH는 작업공간이라고도 하며 사용자마다 별도로 관리됩니다. 폴더 구조자체는 GOROOT와 같으니 관리 주체가 다르기 때문에 알아둘 필요가 있습니다.

추후에 go get 키워드를 사용하여 다른 패키지를 다운받아 사용할 때 더 자세히 알아보도록 하겠습니다.


go mod

사용자 정의 go 모듈을 만들 때 사용합니다.

우선 main.go 파일이 위치한 곳에 example 폴더를 생성해줍니다.

먼저 example 폴더로 진입하여 color 디렉토리를 생성한 후 color.go 파일을 작성해줍니다.

color.go의 내용은 아래와 같습니다.

/** color/color.go */

package color

func Colors() ([]string) {
	return []string{"red","blue"}
}

color.go 파일을 작성하였다면 다시 example 폴더로 돌아가 go mod init example 명령어를 통해 모듈을 정의합니다. 이렇게 하면 아래와 같은 go.mod 파일이 생길 것입니다.

go 모듈을 정의할 때는 모듈 루트에 해야하며 examplecolor 패키지를 포함하는 모듈의 루트입니다.

module example

go 1.19

이제 main.go 파일을 아래와 같이 작성해줍니다.

/** main.go */

package main

import (
	"example/color"
	"fmt"
)

func main() {
	for _, e := range color.Colors() {
    /** red, blue */
		fmt.Println(e)
	}
}

main.go 파일을 작성하였다면 go mod init main 명령어를 사용하여 main 패키지에서 사용할 종속성을 만들어 주어야 합니다. 패키지 경로에 example이 포함되니 go.mod 파일과 동일 디렉토리에 있는 example을 찾도록 아래와 같이 go.mod파일을 아래와 같이 작성해줍니다.

module main

go 1.19

replace example => ./example

go.mod 파일을 작성하였다면 go get example 명령어를 입력하여 생성한 example에 있는 color 외부 패키지를 불러와서 사용할 수 있도록합니다.

go.mod 파일에 아래와 같이 모듈을 불러온 것을 확인할 수 있는데 해당 모듈의 버전과 관련된 정보가 나와있는것을 확인할 수 있습니다.

module main

go 1.19

replace example => ./example

require example v0.0.0-00010101000000-000000000000 // indirect

디렉토리구조는 다음과 같습니다.

|-- /
| |-- main.go
| |-- go.mod /** module main */
| |-- example/
| | |-- color/
| | |-- go.mod /** module example */
| | | |-- color.go

이제 go run main.go 명령어를 사용하여 실행시켜보면 redblue가 차례대로 출력되는것을 확인할 수 있습니다.


go doc

go doc 명령어는 go 패키지의 사용법을 살펴볼 때 사용합니다. 예를 들어 fmt 패키지의 Println() 함수에 대한 사용법이 궁금하다면 go doc fmt Println을 사용하면 다음과 같이 출력됩니다.

package fmt // import "fmt"

func Println(a ...any) (n int, err error)
    Println formats using the default formats for its operands and writes to
    standard output. Spaces are always added between operands and a newline
    is appended. It returns the number of bytes written and any write error
    encountered.

참고자료

Go 언어를 공부하기 위한 자료 및 문서 정리


Go 언어 공부 GoGo~~! 엌ㅋㅋㅋㅋㅋㅋㅋ

0개의 댓글