백엔드/Go := Golang
[ 모듈 시스템 ] go는 export 가 없습니다
잡캐헨리
2024. 9. 10. 20:33
// /pkg/utils/file1.go
package utils
import "fmt"
func PublicFunction() {
fmt.Println("첫번째 함수")
}
결론
결론부터 말하면 Go 언어는 다른 언어들과 달리 export 키워드가 존재하지 않는다. 즉, 다른 패키지에서 사용할 수 있는 함수나 변수를 지정하는 별도의 키워드 없이, 대소문자만으로 공개 여부를 결정한다.
설명
Go에서는 모든 코드가 패키지 단위로 관리되며, 패키지 간 의존성은 모듈 시스템을 통해 관리된다. 패키지는 독립적으로 존재하지만, 필요에 따라 다른 패키지의 요소를 사용할 수 있다.
Go의 중요한 점은 대소문자 규칙을 통해 접근 가능 여부를 결정한다는 것이다. 첫 글자가 대문자인 식별자는 패키지 외부에서 접근할 수 있는 공개된 요소로 처리되며, 첫 글자가 소문자인 식별자는 패키지 내부에서만 사용 가능한 요소로 처리된다.
// mypackage/mymodule.go
package mypackage
// 대문자로 시작하는 함수는 다른 패키지에서 호출할 수 있다.
func ExportedFunction() {
fmt.Println("This is an exported function!")
}
// 소문자로 시작하는 함수는 패키지 내부에서만 사용 가능하다.
func unexportedFunction() {
fmt.Println("This is an unexported function.")
}
예시 코드
/myapp
|-- /pkg
| |-- /utils
| |-- file1.go
| |-- file2.go
|
|-- main.go
|-- go.mod
|-- go.sum
예를들어 위와 같은 프로젝트 구조가 있다고 생각해보자
package utils
import "fmt"
// privateFunction은 같은 패키지 내에서만 호출 가능한 함수입니다.
func privateFunction() {
fmt.Println("This is a private function in file2.")
}
package utils
import "fmt"
// PublicFunction은 패키지 외부에서 호출할 수 있는 함수입니다.
func PublicFunction() {
fmt.Println("This is a public function in file1.")
privateFunction() // 같은 패키지이기 때문에 import 없이 호출
}
이곳에 utils 라는 패키지를 선언하고 해당 패키지 내부에서 서로 참조할 수 있는 코드를 보면 별도의 import문 없이 사용할 수 있는걸 알. 수 있다.
이 코드를 프로젝트 진입점이 되는 파일인 main.go 에서 사용하는 경우는
package main
import (
"myapp/pkg/utils" // utils 패키지 임포트
)
func main() {
utils.PublicFunction() // PublicFunction 호출
}
위와 같이 임포트 후. 호출해서 사용할 수 있다.