Golang의 코드를 묶는 단위이며, 모든 코드는 패키지에 속해야 합니다.
프로그램은 main 패키지 하나와 여러 외부 패키지로 구성된다.
main 패키지는 프로그램 시작점을 포함한 패키지이다. (특별한 패키지)
프로그램이 실행되면 OS는 프로그램을 메모리로 로드시키고 그 후에 프로그램 시작점부터 한 줄씩 코드를 실행한다.
프로그램 시작점이 main() 함수이고 main() 함수를 포함한 패키지가 main 패키지이다.
한 프로그램은 main 패키지 외에 다수의 다른 패키지를 포함할 수 있다.
그냥 원하는 패키지를 import 하여 사용하면 된다.
이미 세상에는 수많은 패키지가 제공되므로 프로그래밍 할 때는 원하는 기능을 제공하는 패키지를 먼저 찾아보는 습관을 들이는게 좋다.
https://golang.org/pkghttps://github.com/avelino/awesome-goimport "fmt"
아래처럼 소괄호로 패키지들을 묶어서 여러 패키지들을 임포트할 수 있다.
import (
"fmt"
"os"
)
패키지를 가져온 후에 해당 패키지명을 쓰고 점 . 연산자를 사용하여 패키지에서 제공하는 함수, 구조체 등에 접근할 수 있다.
fmt.Println("Hello World")
package main
import ( // ❶ 둘 이상의 패키지는 소괄호로 묶어줍니다.
"fmt"
"math/rand" // ❷ 패키지명은 rand입니다.
)
func main() {
fmt.Println(rand.Int()) // ❸ 랜덤한 숫자값을 출력합니다.
}
경로가 있는 패키지에 접근할 때는 마지막 폴더명인 rand만 사용한다.
만약, 패키지 명이 겹치면? 별칭을 줘서 구별해주자.
아래의 예시의 경우 마지막 패키지명이 같아 패키지 명이 동일하다. 어떻게 해야할까?
import (
"text/template"
"html/template"
)
그러면 별칭을 설정하자.
겹치는 패키지 명 별칭설정
import (
"text/template"
htemplate "html/template"
)
이제 "html/template" 패키지는 htemplate 이름으로 사용할 수 있다.
패키지를 가져오면 반드시 사용해야 한다. 안그러면 에러가 발생한다.
패키지를 직접 사용하지는 않지만 부가효과를 얻고자 임포트 하는 경우에는 밑줄을 패키지명 앞에 붙여주면 된다.
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
)
다음의 세 가지 방법으로 찾는다.
go bulid 로 컴파일을 하려면 Go 모듈 루트 포더에 go.mod 파일이 필요go mod init 모듈_이름go mod tidyGo 모듈은 다음의 명령어로 생성할 수 있다.
go mod init [패키지명]

package publicpkg
import "fmt"
const (
PI = 3.1415 // 외부로 공개되는 상수
pi = 3.141516 // 외부로 공개되지 않는 상수
)
var ScreenSize int = 1080 // 외부로 공개되는 변수
var screenHeight int // 외부로 공개되지 않는 변수
func PublicFunc() { // 외부로 공개되는 함수
const MyConst = 100 // 함수 내부에서 선언되어서 외부로 공개되지 않습니다.
fmt.Println("This is a public function", MyConst)
}
func privateFunc() { // 외부로 공개되지 않는 함수
fmt.Println("This is a private function")
}
type MyInt int // 외부로 공개되는 별칭 타입
type myString string // 외부로 공개되지 않는 별칭 타입
type MyStruct struct { // 외부로 공개되는 구조체
Age int // 외부로 공개되는 구조체 필드
name string // 외부로 공개되지 않는 구조체 필드
}
func (m MyStruct) PublicMethod() { // 외부로 공개되는 메서드
fmt.Println("This is a public method")
}
func (m MyStruct) privateMethod() { // 외부로 공개되지 않는 메서드
fmt.Println("This is a private method")
}
type myPrivateStruct struct { // 외부로 공개되지 않는 구조체
Age int // 외부로 공개되지 않는 구조체 필드
name string // 외부로 공개되지 않는 구조체 필드
}
func (m myPrivateStruct) PrivateMethod() { // 외부로 공개되지 않는 메서드
fmt.Println("This is a private method")
}
_ 로 임포트 하면 init()함수만 실행된다.