Go는 2009년 구글에 의해 개발된 오픈 소스 프로그래밍 언어로 기존에 구글에서 사용하는 언어(C++)의 느린 컴파일 시간과 복잡한 패키지 관리를 해결하기 위해 개발되었습니다.
성능, 단순성, 병행성에 중점을 두고 설계되었으며 다양한 표준 라이브러리를 보유하고 있고 큰 규모의 커뮤니티를 가지고 있습니다.
간결한 문법: Go는 쉬운 문법을 가지고 있어 배우기 쉽게 설계되었습니다. 단순하고 직관적인 구문을 가지고 있어 쉽게 이해하고 유지보수할 수 있습니다.
빠른 컴파일 속도: Go는 컴파일 언어이면서 매우 빠른 컴파일 속도를 제공합니다. 또한 컴파일된 결과물이 네이티브 바이너리이기 때문에 Java처럼 별도의 실행 패키지 없이도 실행 가능합니다.
동시성(Concurrency) 지원: Go는 내장된 고루틴(goroutine)을 통해 병렬 프로그래밍을 쉽게 지원합니다.
정적 타입 언어: Go는 Python과 달리 정적 타입 언어로 런타임이 아닌 컴파일 타임에 오류를 포착할 수 있도록 합니다.
가비지 컬렉션: Go는 C++과 달리 가비지 컬렉션 기능을 제공하여 사용자가 메모리 관리에 신경쓸 필요 없이 핵심 로직에만 집중하게 합니다.
맥북에서는 Go 공식 홈페이지 혹은 brew를 통하여 쉽게 설치할 수 있습니다.
$ brew install go
설치가 완료되면 다음과 같이 go가 정상적으로 설치되었음을 확인할 수 있습니다.
$ go version
go version go1.21.5 darwin/arm64
원하는 작업 디렉토리로 이동합니다.
$ mkdir hello
$ cd hello
코드에 의존성 관리를 활성화합니다.
Go는 개별 레포지토리에 go.mod 파일을 통해 패키지의 의존성을 관리합니다.
go.mod 파일을 통해 의존성 관리를 활성화하기 위해 go mod init 명령어를 통해 레포지토리의 모듈 명을 입력합니다.
실제 개발에서는 모듈 경로는 일반적으로 소스 코드가 보관되는 저장소의 위치입니다.
예를 들어 모듈 경로는 github.com/hello와 같이 됩니다.
$ go mod init example/hello
go: creating new go.mod: module example/hello
hello.go 파일을 작성합니다.
package main // main 패키지(엔트리 포인트)를 선언합니다.
import "fmt" // 텍스트 포메팅을 위한 표준 라이브러리를 호출합니다.
func main() { // main 패키지에서 기본적으로 호출되는 main 함수를 선언합니다.
fmt.Println("Hello, World!")
}
작성한 코드를 실행합니다.
$ go run .
Hello, World!
Go는 손쉽게 외부 패키지를 호출할 수 있도록 합니다.
Go의 외부 패키지는 pkg.go.dev에서 쉽게 찾아볼 수 있습니다.
quote 패키지를 호출하여 사용해보도록 하겠습니다.
기존 Go 코드에서 hello.go를 다음과 같이 수정합니다.
package main
import "fmt"
import "rsc.io/quote"
func main() {
fmt.Println(quote.Go())
}
이후 go mod tidy 명령어를 통해 go.mod 파일이 소스 코드와 매치되도록 변경합니다.
go mod tidy는 불필요한 의존성을 제거하고, 필요하지만 추가되지 않은 의존성을 module requirement에 추가합니다.
$ go mod tidy
이후 다음과 같이 require에 quote 모듈이 추가된 것을 볼 수 있습니다.
module example/hello
go 1.21.5
require rsc.io/quote v1.5.2
require (
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
rsc.io/sampler v1.3.0 // indirect
)
또한, go.sum 파일이 작성된 것을 확인할 수 있는데 go.sum 파일은 종속성 관리를 위안 암호화된 체크섬 정보를 저장하고 있어 의존성이 변경되지 않았음을 확인하고 임의의 코드 수정을 방지하여 보안을 향상시키는 파일입니다.