Go : main.go

Sean Kim·2021년 7월 9일
0

GoLang

목록 보기
1/5

Work directory : GOPATH

나는 내 python과 kotlin 소스코드를 로컬 환경의 works 디렉토리 밑에 어플리케이션 단위별로 폴더링하여 저장한다.
다만! Go는 다른 언어들과 완전히 다른 경로 구조를 갖는다. 다른 언어들 처럼 내가 원하는 디렉토리에서 작업을 할 수 없고, 항상 "정해진 디렉토리"에서 작업을 해야한다.

그리고 관례적으로 그 경로를 "GOPATH"라고 부른다.
모든 프로젝트 소스파일과 외부 패키지들, 내가 만든 코드의 컴파일파일들이 바로 이 "GOPATH"에 저장된다.

    GOPATH/src/

이런 디렉토리에 내 소스코드들과 외부 패키지들이 함께 저장되는 것이다.
가령 go get (= pip install 같은 기능이다.)을 통해 아래 경로의 패키지를 설치한다고 한다면,

    github.com/seankim/my_awesome_package

이 패키지는 아래의 디렉토리에 저장되는 것이다.

    GOPATH/src/github.com/seankim/my_awesome_package 

main.go

Go는 코드의 실행을 위해 컴파일이 필요하다.
그리고 이렇게 컴파일이 필요한 경우 파일의 이름을 꼭 main.go로 지어야 한다.

컴파일러는 항상 파일 이름이 main인 것을 찾음

다만 직접적인 실행이 필요없는 경우(=컴파일이 필요없는 경우)에는 파일의 이름이 꼭 main.go가 아니어도 된다. (ex. 오픈소스 라이브러리를 만드는 등의 행위들) 실제로 Go의 fmt 라이브러리엔 컴파일을 위한 "main.go" 파일이 없다!!

결과적으로 컴파일러는 main.go 파일의 main 함수를 찾아 실행하기 때문에, main.go 와 main이라는 이름을 갖는 함수는 필수적이다.

// main.go 
package main // 패키지 이름이 main이 아니면, 컴파일러는 이 파일을 컴파일하지 않는다.

func main() {
	fmt.Println(math.Phi)
}

import "package"

개발을 위해 여러 모듈과 패키지를 만들것이다. 다른 언어와 마찬가지로 Go에서도 이렇게 만들어 둔 (혹은 내려받은) 모듈과 패키지를 import해서 사용할 수 있다.

다만 모든 모듈의 함수들을 import 할 수 있는 것은 아니다.

// somepackage.go
package something // 패키지의 이름을 정해준다.

import "fmt"	  // 포매팅 관련 패키지 임포트

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

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

여기 "Bye"를 출력하는 sayBye와, "Hello"를 출력하는 SayHello가 있다.
차이점이라고 한다면 함수명의 첫번째 글자가 "소문자"인 것과 "대문자"인 것이다.

// main.go
package main    // 패키지의 이름을 정해준다. -> 컴파일러가 인식하는 main 패키지

import "github.com/seankim/my_awesome_package/something" // 위에서 만든 something 패키지 임포트

func main() {
	something.SayHello()	
    	something.sayBye()
}

>>> cannot refer to unexported name something.sayBye

이렇게 실행하면 에러가 반환된다. "exported" 할수없는 something.sayBye를 참조할 수 없다고 한다.

어떤 함수가 exported 가능한 함수일까?
바로 "대"문자로 시작하는 함수이다.

// main.go
package main

import "github.com/seankim/my_awesome_package/something" 

func main() {
	something.SayHello()	
}

>>> Hello

대문자로 시작되는 SayHello 함수를 호출하니 잘 작동한다.
당연하겠지만, Go의 기본 라이브러리 모두 "Exported"한 함수들은 대문자로 시작한다.

profile
이것저것 해보고있습니다.

0개의 댓글