GO #2 - main 패키지와 import 관련 설명

Corner·2022년 5월 15일
0

Go

목록 보기
3/9

:: 이전 포스팅

👉 GO - 시작하기 :: 설치 과정

Main Package

앞에서 main.go 라는 패키지를 만들었습니다. 이 패키지의 이름에 대해서는 선택권이 없습니다.

우리가 패키지 이름을 "main"으로 지은 것은 프로젝트 컴파일을 하고 싶다는 뜻이고 실행을 시켜서 서버를 키고, 웹을 스크랩 해오기 위해

main.go는 필수적으로 필요합니다.

목적에 따라 컴파일 패키지가 필요없을 수도 있습니다. 라이브러리를 만든다던지...오픈 소스에 기여를 하기 위해서는 말이죠.

이러한 경우에는 main.go가 필요하지 않습니다.

컴파일러는 패키지 이름이 main인 것부터 찾아냅니다.

Go에서는 우리가 어떤 패키지를 사용하는지 작성해야 합니다.

가령, 이전에 작성했던 코드에서

package main

...

으로 명시했었죠.

filename.go = packagename === filename 이 되는 것입니다.

Go는 Node.js와 달리 특정 Function을 찾습니다.

func main() {
  ...
}

이 Function을 만드는 것은 매우 중요합니다. Java에서도 main() 메소드가 필요하듯이 Go에서도 프로그램 시작점이 main()입니다.

자동적으로 컴파일러는 메인 패키지와 메인 함수를 찾고 실행하기 떄문입니다.

Javascript나 C와 비슷하기도 합니다.

Python이랑은 거리가 먼 것처럼 보이네요.

colly라는 깃허브 레포지토리를 보면 절대 main.go를 찾아볼 수 없습니다. 모두 패키지 이름은 colly이고, 이 colly라는 사람에 의해 만들어진 리소스들이 있습니다.

colly 이유는 오픈소스와 모든 사람들에게 공유하기 위해 컴파일이 필요없다는 뜻입니다.

main.go라는 것은 오로지 컴파일을 위한 것이기 떄문에 필수입니다.


Packages and Imports

"fmt" 패키지 fmt.println과 기본 println의 차이

저는 main 함수에 코드를 작성할 것인데,

func main() {
	println("Hello World")
	fmt.Println("Hello World")
}

실행 결과는 둘다 똑같이 "Hello World"가 나옵니다.

Golang 에서는 "fmt"라는 기본적인 패키지를 제공해주는

fmt.printlnstdout으로 표준 문자열 출력을 제공하는 함수입니다.

기본 println은 내장된 함수로 stderr를 출력해주는 내장함수입니다.

결국 println은 디버깅할 때 유용해 보입니다.

여기서 재밌는 것은 Go는 GoLand나 VScode에서 fmt.println 사용한 함수의 코드 줄을 지우게 되면 자동으로 import된 부분도 지워집니다.

fmt 패키지

formatting을 위한 패키지입니다.

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

여기서 왜 fmt의 Println은 대문자 P로 시작하는걸까요?

Python이나 Java 무엇인가를 import할 때 import .. from ..이런 형식을 걸치는데

마찬가지로 Javascript는 export까지 해주어야 하죠. Go의 경우에는 function을 export하고 싶다면

function을 대문자로 시작해주면 됩니다. 이러한 이유 때문에 대문자로 시작하는 코드를 볼 수 있습니다.

프로젝트 경로에서 something 디렉토리를 만들고 something.go 파일을 생성합니다.

그리고 코드를 넣습니다.

package something

import "fmt"

func sayBye() {
	fmt.Println("Bye")
}

func SayHello() {
	fmt.Println("Hello")
}

여기서 SayHello() 함수는 대문자로 시작합니다.

다시 main.go 파일에서

package main

import (
	"fmt"
	"github.com/eight-corner/learngo/something"
)

func main() {
	fmt.Println("Hello World")
	something.SayHello()
}

something.SayHello()함수를 사용할 수 있으며, 자동으로 import도 해줍니다.

그런데 우리가 만든 sayBye()함수는 사용할 수 없습니다. 이유는 위에서 말했듯이 export를 하려면 함수명이 대문자로 시작합니다.

profile
Full-stack Engineer. email - corner3499@kakao.com,

0개의 댓글