golang 기초 - 패키지

한나리·2025년 1월 10일

Go

목록 보기
12/19
post-thumbnail

패키지

GO프로그램은 패키지로 구성되고, 패키지는 GO프로그램 소스 파일들의 묶음

기본 패키지는 GO설치시에 GOROOT에 자동 설치

go env | grep GOROOT

=> GOROOT='/opt/homebrew/Cellar/go/1.21.1/libexec'

패키지 선언

pakage 패키지명

func 함수명

함수명을 대문자로 쓸 경우 외부 호출이 가능하지만, 소문자로 쓸 경우 외부 호출 불가

main 패키지

프로그램 시작점을 포함한 패키지. 프로그램이 실행되면 대부분 운영체제는 프로그램을 메모리에 로드하는데, 그런 다음 프로그램 시작점부터 한 줄씩 코드를 실행.
바로 이 시작점이 main()이고, main()을 포함한 패키지가 main 패키지

그 외 패키지

한 프로그램은 main 패키지 되에 다수의 다른 패키지를 포함할 수 있음. 표준 입출력은 fmt 패키지 / 암호화 기능은 crypto 패키지 / 네트워크 기능은 net 패키지를 import 해서 사용

패키지 사용

import

import "fmt"

or

import (
	"fmt"
    "os"
)

패키지 멤버에 접근

패키지명을 쓰고 .을 찍어서 패키지 내부 함수 호출

fmt.Println("Hello World")

경로가 있는 패키지 사용

package main

import (
	"fmt"
    "math/rand"  //패키지명은 rand
)

func main() {
	fmt.Println(rand.Int())
}

겹치는 패키지 문제 별칭으로 풀기

import (
	"text/template"
    "html/template"
)

위와 같이 마지막 폴더명이 같아 결국 패키지 명이 같아질 경우 별칭을 붙여서 해결

import (
	"text/template"
    htemplate "html/template" //별칭 htemplate
)

사용하지 않는 패키지 포함하기

패키지를 가져오면 반드시 사용해야 하는데, 패키지를 임포트하고 나서 사용하지 않으면 에러가 발생. 패키지를 직접 사용하지 않지만 부가효과를 얻고자 import 하는 경우에는 _ 을 패키지명 앞에 붙임

import (
	"database/sql"
    _ "github.com/mattn/go-sqlite3" //밑줄 _을 이용해서 오류 방지
)

"github.com/mattn/go-sqlite3"를 가져왔지만 이 패키지를 직접 사용하지 않고 "database/sql" 패키지에 sqlite3를 사용하겠다는 부가효과를 얻고자 가져옴

부가효과
패키지가 초기화되면서 실행되는 코드에 따른 효과

패키지 설치

import로 패키지를 포함시키려면 go build를 통해서 빌드할 때 해당 패키지를 찾아서 포함한 다음 실행 파일을 생성.

  • GO가 import된 패키지를 찾는 방법
    1️⃣ GO언어에서 기본 제공하는 패키지는 GO설치 경로(GOROOT)에서 찾음
    2️⃣ 깃허브와 같은 외부 저장소에 저장된 패키지의 경우 외부 저장소에서 다운받아서 GOPATH\pkg 폴더에 설치. 이때 GO 모듈에 정의된 패키지 버전에 맞게 다운로드
    3️⃣ 현재 모듈 아래 위치한 패키지인지 검사. 현재 모듈 아래 위치한 패키지는 현재 폴더 아래 있는 패키지를 찾음

GO 모듈

GO프로그램의 소스들을 모아놓은것이 패키지, GO 패지키들을 묶어 놓은것을 GO 모듈이라고 함.
이전까지 GO 모듈을 만들지 않는 GO 코드는 모두 GOPATH/src 폴더 아래 있어야 했지만 GO 모듈이 기본이 되면서 모든 GO 코드는 GO 모듈 아래 있어야 함

go build를 하려면 반드시 GO 모듈 루트 폴더에 go.mod 파일이 있어야 함
go.mod 파일은 모듈 이름과 GO 버전, 필요한 외부 패키지등이 명시
go build 명령어를 통해 실행 파일을 만들 때, go.mod와 go.sum 파일을 통해 외부 패키지와 모듈 내 패키지를 합쳐서 실행 파일을 만듦.

go.mod : 모듈 이름, GO 버전, 필요한 외부 패키지 등이 명시
go.sum : 외부 저장소 패키지 버전 정보를 담고 있는 파일

GO 모듈 생성

go mod init [패키지명]

GO 모듈 만들고 외부 패키지 활용

1️⃣ vscode를 실행해서 프로젝트 폴더를 열어준다. (여기서는 goproject\usepkg)
2️⃣ 새 터미널을 실행한 다음 goproject\usepkg 폴더에서 go 모듈 생성 명령어 입력해서 GO 모듈 생성

goproject\usepkg> go mod init goproject\usepkg
//go.mod
module goproject/usepkg //모듈 명

go 1.16 //Go 버전

3️⃣ usepkg 폴더 아래 custompkg 폴더 생성
4️⃣ custompkg 폴더 안에 custompkg.go 파일 생성

//custompkg.go
package custompkg

import "fmt"

func PrintCustom() {
	fmt.Println("This is custom package!")
}

5️⃣ 상위 폴더인 usepkg 폴더에 usepkg.go 파일을 생성

//usepkg.go
package main

import (
	"fmt" //표준 패키지
    "goproject/usepkg/custompkg" // 모듈 내 패키지
    
    "github.com/guptarohit/asciigraph" //외부 저장소 패키지
    "github.com/turkersGo/musthaveGo/ch16/expkg"
)

func main() {
	custompkg.PrintCustom()
	expkg.PrintSample()
    
    data := []float64{3,4,5,6,9,7,5,8,5,10,2,7,2,5,6}
    grap := asciigraph.Plot(data)
    fmt.Println(graph)
}

6️⃣ 터미널에서 go mod tidy를 실행. 이 명령어는 GO 모듈에 필요한 패키지를 찾아서 다운로드해주고 필요한 패키지 정보를 go.mod 파일과 go.sum 파일에 적어줌
아래는 변경된 go.mod 파일

//go.mod
module goproject/usepkg //모듈 명

go 1.16 // GO 버전

require( //외부 패키지들
	github.com/guptarohit/asciigraph v0.5.1
    github.com/turkersGo/musthaveGo/ch16/expkg v0.0.0
)

7️⃣ go build 명령으로 실행 파일 생성 후 실행

goproject\usepkg> go build
goproject\usepkg> .\usepkg.exe

외부 패키지 저장 위치
다운받은 외부 패키지들은 GOPATH/pkg/mod 폴더에 버전별로 저장
그래서 이미 한 번 다운받은 패키지들은 다른 모듈에서 사용되더라도 같은 버전이라면 다시 다운로드하지 않고 사용

패키지명과 패키지 외부 공개

  • GO 언어에서 패키지명은 쉽고, 간단하게 이름 지을 것을 권장. 그리고 모든 문자를 소문자로 할 것을 권장

  • 패키지 전역으로 선언된 첫 글자가 대문자로 시작되는 모든 변수, 상수, 타입, 함수, 메서드는 패키지 외부로 공개됨

  • 구조체 이름의 첫 글자가 대문자이고 필드명 역시 첫 글자가 대문자인 구조체의 필드 역시 외부로 공개

패키지 초기화

패키지를 import하면?
1️⃣ 패키지를 import하면 컴파일러는 패키지 내 전역 변수를 초기화
2️⃣ 그런 다음 패키지에 init()함수가 있다면 호출해 패키지를 초기화
init() 함수는 반드시 입력 매개변수가 없고 반환값도 없는 함수여야 함. 만약 어떤 패키지의 초기화 함수인 init()함수 기능만 사용하기 원할 경우 밑줄 _을 이용해서 import함

import (
	"database/sql"
    _ "github.com/mattn/go-sqlite3" //밑줄 _을 이용해서 오류 방지
)

위와 같이 코드에서 go-sqlite3 패키지를 사용하진 않지만, init()함수 기능이 필요한 경우에 밑줄 _을 이용해서 import

profile
내가 떠나기 전까지는 망하지 마라, 블록체인 개발자

0개의 댓글