GoLang
2007년 구글에서 일하던 켄 톰슨, 롭 파이크 로버트 그리즈머에 의해 개발되었으며, C++의 느린 빌드 속도, 언어의 복잡성, 안정성 확보의 어려움, 동시성 프로그래밍의 어려움에 한계를 느끼고 이를 개선한 Go 언어가 개발되었다.
Go Lang 특징
- 구글에 의해 개발되고 관리되는 오픈 소스 언어
- 배우기 쉽고, 시작하기 쉬운 언어
- 동시성과 강력한 라이브러리들 내장
- 성장하는 파트너, 커뮤니티와 도구들
- 모든 프로그램의 시작은 main 패키지의 main 함수
- Go언어의 프로그램은 반드시 main 패키지가 있어야 하며, main 함수가 있어야 한다. 이 main패키지의 main 함수는 모든 프로그램이 시작하는 시작지점이 된다.
즉 Go는 각각 개별적으로 파일을 실행시킬 수 있는 것이 아닌, main패키지와 main함수를 포함하는 파일이라는 명확한 실행 진입점이 존재를 하게 된다. 때문에 원하는 파일 하나만 독립적으로 실행을 못한다.
package main
func main() {
println("안녕하세요")
}
import
- import 는 다른 패키지의 함수들을 사용할 수 있게 한다
- printf와 같은 함수를 사용하고 싶을때 fmt 패키지 내에 종속되어 있기 때문에 해당 패키지를 import 해와서 쓰도록한다.
- Go에서는 함수가 대문자로 되어 있어야 export가 된다. 예를 들어 커스텀 함수를 import 시켜 쓰고 싶을때, export할 함수의 첫글자는 무조건 대문자가 되어야 한다. 때문에 주로 Camel Case의 방식을 주로 사용한다
- 또한 import의 경로를 입력할 때, 작은 따옴표가 아닌 큰 따옴표로 묶여있어야 한다.
- 만약 go.mod에서 모듈 이름이 설정될 경우, 경로는 go.mod에 기입한 module의 이름이 절대 경로가 되며, 앞에 위치 해야 한다.
package something
import "fmt"
func SayHello(){
fmt.Println("Wassssssup")
}
package main
import (
"fmt"
"main/something"
)
func main(){
fmt.Println("hello")
something.SayHello()
}
Directory와 Package
- Go에서는 Directory가 굉장히 중요하다. 많은 다른 언어들은 실제 디렉토리 역할 이상을 하진 않지만, Go는 패키지와 아주 밀접한 관계가 있기 대문에, 프로그램이 어떻게 작성될지 결정하는 한 부분이 된다.
- 그 때문에 디렉토리 구조가 곧 패키지를 어떻게 구성할 것인지를 판단할 수 있게 된다.
- Go에서 Package는 go.mod 파일이 있는 모듈의 루트(경로)를 기준으로 한 디렉토리의 하나만 존재할 수 있다. 따라서 한 디렉토리에 여러개의 go 파일은 존재할 수 있지만 package의 이름은 동일해야 한다.
- func main()가 진입점 역할을 수행햐며, apckage main 함수에 구현되어 있어, 만약 패키지를 정의하지 않으면 빌드 도구들이 실행파일을 만들지 못한다.
- func init()로 패키지가 로드될 때 가장 먼저 호출되는 함수가 존재, 패키지의 초기화 로직이 필요할때 사용한다
└── something
├── something1.go
└── something2.go
// 와 같은 구조로 있다고 하더라도, something1.go와 something2.go의 package name은 동일해야 한다
- 또한 패키지의 이름은 기본적으로 디렉토리의 이름을 따라가는것이 관례이다.
- 만약 패키지의 이름이 디렉토리의 이름과 다른 경우 패키지를 호출할 때 Alias를 붙이는것이 관례이다