Go 패키지의 매커니즘
패키지 Main
Go Lang의 Main패키지는 컴파일러가 공유 라이브러리가 아닌 실행 프로그램으로 만들어 컴파일러가 특별하게 인식패키지를 공유 라이브러리로 만들 때는, Main패키지 및 함수를 사용하면 안됨
package main
import "fmt"
func main(){
fmt.Println("Hello")
}
패키지 생성방법
e.g.GOPATH환경변수 위치
test_go 패키지 생성
패키지 Scope
이름의 첫 문자를 대문자로하면 Public으로 간주되어 [함수, 구조체, 인터페이스, 메소드] 외부에서 호출가능import할때는 폴더를 참조하여 폴더의 파일들의 첫 문자가 대문자인 함수를 호출가능
파일이름 : test.go
package test_go
import "fmt"
func Test1(){
fmt.Println("test1gogo")
}
func Test(){
fmt.Println("I AM test")
}
파일이름 : test2.go
package test_go
import "fmt"
func Test2(){
Test1()
}
func test(){
fmt.Println("test out")
}
package main
import (
"test_go"
)
func main(){
test_go.Test1() // 외부에서 호출가능
test_go.Test2() // 외부에서 호출가능
test_go.Test()
// test_go.test() // 소문자를 사용하여 외부에서 호출 불가능
}
패키지 Init
패키지를 처음 실행할 때 별도의 호출없이 처음으로 호출되는 함수
패키지의 Init함수들이 실행되고 main이 실행됨
e.g.
package main
import (
"test_go"
"fmt"
)
func init(){
fmt.Println("Main Init start")
}
func main(){
test_go.Test1()
test_go.Test2()
test_go.Test()
}
Go 메서드
func과 함수명 사이의 (r Rect) 선언되어 Rect구조체를 r로 정의하고, 함수에서 활용하는 방식
main함수에서는 구조체선언과 함수실행을 동시에 선언함
package main
// 구조체 정의
type Rect struct {
width, height int
}
//area의 메서드를 정의
func (r Rect) area() int {
return r.width * r.height
}
func main() {
rect := Rect{10, 20}
area := rect.area() //메서드 호출
println(area)
}
포인터 메서드 Receiver
이전의 area() 함수내의 width 및 height가 변경되더라도 main함수의 rect 구조체 값에는 변화가 없지만,
area2()같은 경우 포인터를 Receiver하기 때문에 r.width++가 main함수내의 값에도 반영되어 변경된다.
type Rect struct {
width, height int
}
// r로 선언한 Rect구조체 포인터 선언
func (r *Rect) area2() int {
// 함수내의 주소값에 +1 하기 때문에 main함수에서 값이 증가한 상태로 나옴
r.width++
return r.width * r.height
}
func main() {
rect := Rect{10, 20}
area := rect.area2() //메서드 호출
// 이전에 area의 값에도 11 * 20의 값으로 출력함
println(rect.width, area) // 11 220 출력
}