
Go의 패키지는 자바의 패키지와 비슷합니다. 모든Go코드는 특정 패키지에 포함되어야 합니다.특수 패키지인
main을 제외하고는 모두 일반적인 패키지라고 보면 됩니다.
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폴더를 주목해야합니다.
> 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명령어를 통해 받은 패키지나 라이브러리, 소스파일이 위치하는 곳추후에
GOROOT와GOPATH에 대해 자세히 알아볼 것이니 오늘은 간단히 세팅만 하도록 하겠습니다.세팅을 완료하였다면
go env를 입력하여GOROOT와GOPATH가 잘 적용되었는지 확인합니다.
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을 통해서 다른 패키지를 다운받아 사용할 수 있습니다. 얻어온 패키지는 일반적으로GOPATH로 다운로드 되며,GOPATH는 작업공간이라고도 하며 사용자마다 별도로 관리됩니다. 폴더 구조자체는GOROOT와 같으니 관리 주체가 다르기 때문에 알아둘 필요가 있습니다.추후에
go get키워드를 사용하여 다른 패키지를 다운받아 사용할 때 더 자세히 알아보도록 하겠습니다.
사용자 정의
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모듈을 정의할 때는 모듈 루트에 해야하며example은color패키지를 포함하는 모듈의 루트입니다.
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명령어를 사용하여 실행시켜보면red와blue가 차례대로 출력되는것을 확인할 수 있습니다.
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 언어 공부 GoGo~~! 엌ㅋㅋㅋㅋㅋㅋㅋ