ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Golang] package 관리, 선언하기
    언어/Golang 2020. 2. 16. 20:57

    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"
    )


    댓글