Go의 패키지는 코드 조직 및 가시성 관리를 위한 기본 빌딩 블록입니다. 역사적으로 Go는 프로그래밍을 투명하게 만들고 C/C++ 및 Java와 같은 의존성 해결의 불확실성을 피하기 위해 간단한 가져오기 모델과 폴더 계층 구조를 선택했습니다. Go가 해결하는 문제는 명확한 프로젝트 구조를 생성하고 이름 충돌 및 모듈 간의 독립성을 방지하는 것입니다.
문제: 조직에 대한 단일 접근 방식이 없으면 애플리케이션 확장이 불가능하고 중복이 발생하며 이름 충돌 및 순환 종속성이 생깁니다. 객체의 가시성을 명시적으로 관리하는 것이 중요합니다.
해결책: 각 디렉터리는 패키지 파일을 포함하고 (package somepackage), 디렉터리 이름과 패키지 이름은 모범 사례에 따라 일치해야 합니다. 가져오기는 import 키워드를 통해 이루어지며, 대문자로 시작하는 객체만이 내보내집니다. 의존성 관리는 go modules (go.mod)를 통해 이루어집니다.
구조 및 가져오기 예:
// internal/mathops/add.go package mathops func Add(a, b int) int { return a + b } // main.go package main import ( "fmt" "myservice/internal/mathops" ) func main() { fmt.Println(mathops.Add(2, 3)) }
주요 특징:
하나의 디렉터리에 여러 다른 패키지를 선언할 수 있습니까?
아니요, 디렉터리 내 모든 파일은 하나의 패키지에 속해야 합니다.
이름이 대문자로 시작하고 패키지가 소문자로 명명된 경우 함수가 내보내질까요?
네, 내보내기는 객체(함수, 타입, 변수)의 첫 글자에만 의존하며 패키지 이름과는 무관합니다.
다른 별칭으로 패키지를 가져올 수 있으며, 이것이 함수의 가시성에 영향을 미칠까요?
네, 가능합니다. 별칭은 패키지에 대한 호출 이름에만 영향을 미치며 가시성 범위는 변경되지 않습니다:
import mymath "myservice/internal/mathops" mymath.Add(1,2)
개발자가 모든 함수를 main 패키지의 "utils.go"라는 파일에 넣고 비즈니스 로직을 별도의 패키지로 분리하지 않습니다.
장점:
단점:
비즈니스 로직, 유틸리티, 핸들러, 데이터 모델을 독립적인 패키지인 mathops, user, storage, api로 분리합니다. 가져오기는 엄격하게 목적에 맞게 이루어지며, 각 패키지는 개별적으로 테스트됩니다.
장점:
단점: