main package

패키지 이름에 main이라고 되어 있으면 Go 컴파일러가 이를 실행 프로그램으로 인식합니다. 또한 main 패키지 안의 main() 함수를 시작하고자 하므로 라이브러리를 만들 때, main 패키지나 함수명을 사용하면 안됩니다.

package import

패키지를 import하는 방법은 아래와 같이 2가지가 있습니다.

package main

// 단일 패키지 선언


import "bytes"


// 복수 패키지 선언

import (
   "bytes"
   "encoding/json"
   "encoding/xml"
   "io/ioutil"
   "net/http"
)

package scope

패키지 내에는 함수, 구조체, 인터페이스, 메소드 등이 있는데, 이러한 이름의 첫 문자를 대문자로 시작하면 public으로 간주되어 외부에서 호출할 수 있습니다. 만약 첫 문자가 소문자로 시작하면 이는 같은 패키지 내부에서만 호출할 수 있습니다.

여기서 다른 언어와 달라서 헷갈린 점은 파일의 이름은 선언하거나 사용할 때, 중요하지 않습니다. import는 폴더까지만 선언하며 호출은 첫 문자가 대문자인 모든 함수를 호출할 수 있습니다.

// main
package main

import (
   "util"
)


func main() {
   util.Test1()
   util.Test2()
   //util.test() // 호출 불가
}


// util/test.go
package util

import "fmt"

func Test1() {
   fmt.Println("Test1")
}


func test() {
   fmt.Println("test")
}


// util/test1.go
package util

import "fmt"

func Test2() {
   fmt.Println("Test2")
   test() // test1.go와 동일한 패키지에 있으므로 접근 가능

}

package init

패키지를 작성할 때, init()함수를 작성하여 패키지가 로드될 때, 자동으로 호출할 수 있습니다.

package main

import (
   "util"
)


func init()  {
   println("main init() 실행")
}


func main() {
   println("main 실행")
   util.Test1()
   util.Test2()
   //util.test() // 호출 불가
}


package util

import "fmt"

func init()  {
   println("test1 init() 실행")
}

func Test1() {
   fmt.Println("Test1")
}


func test() {
   fmt.Println("test")
}


package util

import "fmt"

func init()  {
   println("test2 init() 실행")
}
func Test2() {
   fmt.Println("Test2")
   test()

}


호출 순서:

test1 init() 실행
test2 init() 실행
main init() 실행
main 실행
Test1
Test2
test

package alias

가끔씩 패키지의 init() 호출만 필요하고 이후 사용을 하지 않을 경우가 있습니다. 이럴 때, _를 사용하여 init()만 호출할 수 있습니다.

import (
   _ "github.com/lib/pq"
   "database/sql"
   "util"
)


또한, 다른 위치에 존재하지만 패키지 이름이 동일한 경우 alias로 별칭을 지어줄 수 있습니다.

import (
   pg "database/pg/db"
   mysql "database/mysql/db"
   "util"
)


'언어 > Golang' 카테고리의 다른 글

[Golang] 에러  (0) 2020.02.23
[Golang] package 관리, 선언하기  (0) 2020.02.16
[Golang] http 모듈 사용하기  (0) 2020.02.16
[Golang] map  (0) 2020.02.09
[Golang] 배열 (array) & 슬라이스 (slice)  (0) 2020.02.09
[Golang] 함수 (function)  (0) 2020.02.09
[GO] 데이터 타입 & 연산자  (0) 2020.02.09