Go 1.18 첫 프로그램 실행 및 기본 문법과 모듈 시스템 이해

Go 언어로 첫 번째 프로그램을 작성하고 실행하는 과정은 컴파일형 언어의 특성을 이해하는 좋은 시작점입니다. 이 글에서는 Go 프로그램의 실행 방식, 기본 문법 규칙, 그리고 최신 의존성 관리 시스템인 Go Modules의 핵심 개념을 다룹니다.

프로그램 컴파일 및 실행

임의의 작업 디렉터리에 main.go 파일을 생성하고 다음과 같이 코드를 작성합니다.

package main

import "fmt"

func main() {
    appName := "GoLang"
    version := 1.18
    fmt.Printf("Running %s version %.2f\n", appName, version)
}

터미널에서 go run 명령어를 사용하면 소스 코드를 임시로 컴파일한 후 바로 실행합니다. 이 과정에서는 실행 파일이 현재 디렉터리에 남지 않습니다.

$ go run main.go
Running GoLang version 1.18

만약 배포를 위해 독립적인 실행 파일이 필요하다면 go build 명령어를 사용해야 합니다.

$ go build main.go
$ ls
main.go  main

Go 기본 문법 분석

주석(Comments)

Go는 코드에 설명을 추가하기 위해 단일 행 주석(//)과 다중 행 주석(/* */)을 지원합니다. 컴파일러는 빌드 과정에서 주석을 완전히 무시합니다.

// 단일 행 주석입니다.

/*
여러 행에 걸친
주석입니다.
*/

패키지(Package) 선언

모든 Go 소스 파일은 최상단에 package 선언으로 시작해야 합니다. Go에서 패키지는 디렉터리 단위로 관리됩니다. 실행 가능한 애플리케이션을 만들려면 반드시 main 패키지를 사용해야 하며, 이는 프로그램의 진입점을 정의합니다.

package main

패키지 가져오기(Import)

외부 또는 표준 라이브러리를 사용하려면 import 키워드를 사용합니다. 여러 패키지를 가져올 때는 괄호를 사용하여 묶을 수 있습니다.

import (
    "fmt"
    "os"
)

주의: Go 컴파일러는 매우 엄격하여, 코드 내에서 실제로 사용되지 않는 패키지를 import하면 컴파일 오류가 발생합니다.

패키지를 가져올 때 몇 가지 특별한 연산자를 사용할 수 있습니다.

  • 점(.) 연산자: 패키지 이름 접두사 없이 함수를 직접 호출할 수 있습니다.
import . "math"

func main() {
    // math.Sqrt 대신 Sqrt만 사용 가능
    result := Sqrt(16) 
}
  • 별칭(Alias): 패키지 이름이 충돌하거나 긴 경우 별칭을 부여할 수 있습니다.
import output "fmt"

func main() {
    output.Println("별칭을 사용한 출력")
}
  • 언더스코어(_): 패키지의 함수를 직접 호출하지 않더라도, 해당 패키지의 init() 함수를 실행하기 위해 사용합니다.
import _ "net/http/pprof"

함수 정의

Go에서 함수는 func 키워드로 정의합니다. 중요한 문법 규칙은 여는 중괄호({)가 반드시 함수 선언과 같은 줄에 위치해야 한다는 점입니다. 다른 줄에 배치하면 컴파일 오류가 발생합니다.

func calculateSum(a int, b int) int {
    return a + b
}

GOPATH에서 Go Modules로

과거 Go 1.10 이하 버전에서는 GOPATH 환경 변수를 사용하여 의존성을 관리했습니다. GOPATH 구조는 다음과 같았습니다.

  • bin: 컴파일된 실행 파일 저장
  • pkg: 컴파일된 패키지 객체 파일(.a) 저장
  • src: 소스 코드 저장

하지만 Go 1.11부터는 Go Modules가 도입되어 버전 관리와 의존성 해결이 획기적으로 개선되었습니다. 이는 GO111MODULE 환경 변수로 제어됩니다.

  • off: 모듈 지원 비활성화. GOPATH와 vendor 폴더에서 패키지를 찾습니다.
  • on: 모듈 지원 활성화. GOPATH를 무시하고 go.mod를 기반으로 의존성을 다운로드합니다.
  • auto: 프로젝트가 GOPATH 외부에 있고 go.mod 파일이 존재할 경우 자동으로 모듈 모드로 전환합니다.

현재 Go 1.18을 포함한 최신 버전에서는 GOPATH 방식이 사실상 폐기되었으므로, GO111MODULE=on으로 설정하고 Go Modules 기반으로 프로젝트를 구성하는 것이 표준입니다.

태그: go Go1.18 GoModules GOPATH GoSyntax

8월 15일 22:19에 게시됨