프로그래밍Middle/Lead Go 개발자

패키지와 가시성에 대한 Go의 특징에 대해 이야기해 주세요. 언제, 어떻게 내보내는 객체와 내보내지 않는 객체를 사용해야 하나요?

Hintsage AI 어시스턴트로 면접 통과

답변

Go에서 변수, 함수, 구조체 및 메서드의 가시성은 첫 글자의 대문자와 밀접하게 관련되어 있습니다:

  • 이름이 대문자로 시작하면 — 객체는 패키지 외부에서 내보내집니다.
  • 이름이 소문자로 시작하면 — 객체는 자신이 속한 패키지 내부에서만 접근할 수 있습니다.

example.go 파일:

package mypkg var ExportedVar int // 다른 패키지에서 접근 가능 var unexportedVar int // mypkg 내에서만 접근 가능

패키지를 임포트할 때는 내보내는 객체에만 접근할 수 있습니다.

모범 사례:

  • 구현 세부정보를 숨기고 필요한 유형 및 함수만 내보내기.
  • 개인 상수/함수에 대해서는 소문자 이름을 사용하기.

스위트 질문

질문: "내보내지 않는 필드를 가진 구조체를 내보낼 수 있나요? 다른 패키지에서 그런 필드를 사용하려고 하면 어떻게 되나요?"

답변: 대문자로 시작하는 구조체만 내보내집니다. 소문자로 시작하는 모든 구조체 필드는 패키지 외부에서 접근할 수 없습니다. 외부에서 이러한 필드에 접근하려고 하면 컴파일 오류가 발생합니다.

예시:

// package user type User struct { Name string // 내보내는 필드 age int // user 패키지 외부에서는 접근할 수 없음 }

다른 패키지에서:

u := user.User{Name: "Ivan"} u.age = 42 // 컴파일 오류: age는 접근할 수 없음

실제 사례의 오류 예시


이야기

JSON 직렬화 시 데이터 손실: REST API에서 구조체는 내보냈지만, 필드는 내보내지 않도록(소문자) 설정했습니다. 결과적으로 JSON으로 직렬화하기 위해 이러한 필드가 포함되지 않아 API 사용자에게 필요한 정보를 제공하지 못했습니다.


이야기

필요한 함수 접근 불가: 팀이 유용한 유틸리티를 별도의 패키지로 옮겼지만, 그 이름을 대문자로 설정하는 것을 잊었습니다. 함수는 여전히 접근할 수 없게 되었고, 인터페이스를 수정해야 했습니다.


이야기

코드 자동 생성 시 이름 충돌: 한 패키지에서 소문자 대문자가 다른 동일한 이름을 가진 변수를 사용하여 코드를 생성하는 스크립트가 있었습니다. 자동 생성 스크립트 중 하나가 내보내는 상수를 소문자 이름으로 우연히 변경했습니다. 이로 인해 애플리케이션은 이 상수에 대한 글로벌 접근을 잃어버렸고, 일부 기능은 사용할 수 없게 되었습니다.