Learning
레슨 5 / 8·20분

패키지와 모듈

패키지 구조

Go 프로그램은 패키지로 구성됩니다. 하나의 디렉토리는 하나의 패키지이며, go mod로 모듈을 관리합니다. 대문자로 시작하는 이름만 외부에 공개(export)됩니다.

go
// 프로젝트 구조 예시:
// myapp/
//   go.mod
//   main.go
//   calc/
//     math.go
//     math_test.go

// --- go.mod ---
// module myapp
// go 1.21

// --- calc/math.go ---
package calc

// Add - 대문자로 시작하면 외부 공개 (exported)
func Add(a, b int) int {
    return a + b
}

// subtract - 소문자로 시작하면 패키지 내부만 사용
func subtract(a, b int) int {
    return a - b
}

// --- main.go ---
// package main
//
// import (
//     "fmt"
//     "myapp/calc"
// )
//
// func main() {
//     fmt.Println(calc.Add(3, 4))  // 7
// }

go mod 명령어

go
// 새 모듈 초기화
// $ go mod init myapp

// 외부 패키지 추가
// $ go get github.com/gorilla/mux

// 사용하지 않는 의존성 정리
// $ go mod tidy

// 의존성 다운로드
// $ go mod download

자주 쓰는 표준 라이브러리

go
package main

import (
    "encoding/json"
    "fmt"
    "os"
    "strings"
    "time"
)

func main() {
    // strings 패키지
    s := "Hello, Go World"
    fmt.Println(strings.ToUpper(s))         // HELLO, GO WORLD
    fmt.Println(strings.Contains(s, "Go"))  // true
    fmt.Println(strings.Split("a,b,c", ",")) // [a b c]
    fmt.Println(strings.Join([]string{"a", "b"}, "-")) // a-b

    // time 패키지
    now := time.Now()
    fmt.Println(now.Format("2006-01-02 15:04:05"))

    // JSON 인코딩/디코딩
    type User struct {
        Name string 'json:"name"'
        Age  int    'json:"age"'
    }

    user := User{Name: "김철수", Age: 25}
    data, _ := json.Marshal(user)
    fmt.Println(string(data))  // {"name":"김철수","age":25}

    // 환경 변수
    home := os.Getenv("HOME")
    fmt.Println("홈:", home)
}
  • fmt -- 포맷 출력 (Println, Printf, Sprintf)
  • strings -- 문자열 조작 (Split, Join, Contains 등)
  • strconv -- 문자열/숫자 변환
  • os -- 파일, 환경 변수, 프로세스
  • io -- 입출력 인터페이스
  • encoding/json -- JSON 인코딩/디코딩
  • net/http -- HTTP 클라이언트/서버
  • time -- 시간, 타이머, 포맷
💡

Go의 시간 포맷은 독특합니다. "2006-01-02 15:04:05" 라는 고정 참조 시간을 사용합니다. 다른 언어의 YYYY-MM-DD와 다르니 주의하세요.