Package import


import (
    "fmt"
    "math/rand"
)

중복되는 이름은 Alias 부여

import (
	// 같은 template 이름, 충돌나서 에러 발생
	"text/template"
	"html/template"
)

// 아래와 같이 변경 (명칭)
import (
    "text/template"
    htemplate "html/template"
)

사용하지 않는 패키지는 _을 별칭으로 두어, 에러 방지 (패키지를 import하면 무조건 사용해야함)

import (
	"database/sql"
	_ "github.com/mattn/go-sqlite3"
)

2. go.mod


Go 모듈은 GO 패키지 들을 모아놓은 Go 프로젝트 단위. 과거에는 없어도 실행할 수 있었으나, 이제는 반드시 필요. (Go build을 하려면 반드시 필요)

go 모듈은 go mod init을 통해 만들 수 있음

go mod init <package name>

그리고, go.mod을 기준으로 패키지를 검색합니다. go.mod 아래에 있는 모든 서브디렉토리를 찾아 main패키지를 찾고, 거기를 진입 지점으로 삼습니다.

main을 제외한 패키지들은 go.mod의 패키지 이름 + 디렉토리 이름을 따라갑니다.

module chapter14/ex14.2

go 1.25.0

// Go.mod

- go.mod
- test.go
| - publicpkg
  | - publicpkg.go  

// 파일 구조

위의 상황에서, test.go는 아래와 같이 publicpkg.go을 import 할 수 있습니다.

package main

import (
	"chapter14/ex14.2/publicpkg" // chapter14/ex14.2(go.mod package) + publicpkg(directory)
)

// 단 여기서 import할 때는 디렉토리 이름을 기준으로 하지만, 그 안의 함수나 구조체 접근은 publicpkg.go에 선언된 package <pkg name>을 따라갑니다.

// 예) package publicpkg 라고 했으면 publicpkg.MyVar - 대부분은 이렇게 작성(관례)
// 예) package mypkg 라고 했으면 mypkg.MyVar - 이 케이스는 directory구조와 package 이름이 다른 경우 

3. go mod tidy


go mod tidy는 Go 모듈에 필요한 패키지를 찾아서 다운로드 해주고, 필요한 패키지 정보를 go.mod와 go.sum파일에 적어준다.

4. 패키지 초기화


패키지의 초기화는 Global Variable 과 init () 함수 순으로 진행됩니다. 한 패키지(디렉토리) 안에 여러 파일들은 알파벳 순서로 초기화되나, 이는 언제든지 변경될 수 있습니다.

Go에서는 init은 파일 간에 서로 의존적이지 않아야된다고 설명하고 있습니다.