반응형

Go package & Go init

I. Import & Package

1. 패키지

package main 
  • 코드의 구조화(모듈화) 및 재사용성 제공
  • 패키지 이름 == 디렉터리 명
  • 같은 패키지 내에 있으면 소스파일들이 디렉터리명을 패키지 이름으로 사용 (단 main은 제외 => package main은 start point기 때문에 디렉토리 내에 단 하나만 존재해야 함)
  • main이 아닌 패키지의 경우 main 메서드가 필요하지 않지만, 단독 실행은 불가
  • 패키지 내의 함수가 소문자로 시작하면 Private, 대문자 시작 시 Public
  • 독립적인 작은 패키지 단위로 제작하고 조합해 하나의 프로그램을 형성하는 것을 권고함

Main 패키지 하위에 Scrape 패키지를 별도로 제작하여 개별 구성

2. import

package main

import (
    "fmt"
    "src/mypackage"
)
  • 패키지를 사용할 때 import를 이용
  • package 내에 Public함수만 접근 가능
  • Go에서 제공하는 패키지 외에 사용자가 직접 패키지를 만들어 import 가능

사용자 패키지 import 예시

  • as 문 가능(alias)
import (
    f "fmt"
)

func main(){
    f.Println("f로 호출하면 됩니다!")
}
  • go fmt가 사용하지 않는 패키지는 자동으로 삭제하기 때문에 사용 예정인 패키지는 아래 첨자로 보호
import (
    f "fmt"
    _ "src/somedayUse   // 포멧터가 패키지를 제거하지 않음
)
...

II. Go init

  • 일반적으로 package main 파일을 실행하면 func main() 함수가 가장 먼저 동작하는데 init() 메서드는 이 법칙을 무시
  • 단 init만 존재하는 경우 실행 불가
  • 프로그램(main) 실행 전 변수 초기화 등 기본 세팅이 필요한 경우 사용
package call

func init(){
    "call init run"
}
...
package main

import (
    "fmt"
    "src/call"
)
func init() {
    fmt.Println("init code")
}

func main() {
    fmt.Println("main code")
}
...

>> go run main.go
call init run
init code
main code
  • 실행 순서
    1 main.go 실행
    2 import 확인
    3 src/call을 import 하며 call.init() 확인
    4 call.init() 실행
    5 main.go 의 init() 확인
    6 main.init() 실행
    7 main.main() 실행
반응형
복사했습니다!