백엔드/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 호출
}

 

위와 같이 임포트 후. 호출해서 사용할 수 있다.