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 사용자에게 필요한 정보를 제공하지 못했습니다.
이야기
필요한 함수 접근 불가: 팀이 유용한 유틸리티를 별도의 패키지로 옮겼지만, 그 이름을 대문자로 설정하는 것을 잊었습니다. 함수는 여전히 접근할 수 없게 되었고, 인터페이스를 수정해야 했습니다.
이야기
코드 자동 생성 시 이름 충돌: 한 패키지에서 소문자 대문자가 다른 동일한 이름을 가진 변수를 사용하여 코드를 생성하는 스크립트가 있었습니다. 자동 생성 스크립트 중 하나가 내보내는 상수를 소문자 이름으로 우연히 변경했습니다. 이로 인해 애플리케이션은 이 상수에 대한 글로벌 접근을 잃어버렸고, 일부 기능은 사용할 수 없게 되었습니다.