Go 언어 기초 학습: 설치부터 기본 문법까지

1. Go 언어 소개 및 설치

1.1 Go 언어를 배우는 이유

Go 언어는 단순하고 명확한 키워드와 문법을 갖추고 있어 학습 곡선이 낮습니다. 컴파일 속도가 매우 빠르고 실행 효율이 높아 개발 생산성이 뛰어납니다. 또한 표준 라이브러리가 풍부하고 외부 패키지 생태계가 강력합니다. Go 언어의 핵심적인 장점은 다음과 같습니다:
  • 엄격한 문법 검사를 통한 높은 안정성
  • go mod 명령어를 통한 명확한 의존성 관리
  • 강력한 컴파일 검사 및 표준화된 코딩 규범
  • 완전한 소프트웨어 생명주기 도구 지원
  • 다양한 플랫폼 크로스 컴파일 지원
  • 채널(Channel) 기반의 비동기 프로그래밍으로 유지보수 용이
  • goroutine을 통한 효율적인 동시성(Concurrency) 처리
Go 언어는"云-native 언어"로 불리며, 클라우드 네이티브 환경에서의 배포와 확장에 최적화되어 있습니다. 언어 설계 원칙은 단순성(Simplicity), 가독성(Readability), 기능성(Producibility)으로 구성됩니다.

1.2 설치 방법

Go 다운로드

공식 웹사이트(All releases - The Go Programming Language)에서 운영체제에 맞는 설치 파일을 다운로드합니다. Windows 환경에서는 .msi 파일 형식을 사용합니다.

환경 변수 설정

컴퓨터 → 속성 → 고급 시스템 설정 → 환경 변수로 이동하여 다음 항목을 설정합니다.

GOPATH: 패키지 설치 시 다운로드 위치로 사용됩니다. PATH 환경 변수에 GOPATH를 추가합니다.

GOPROXY: Go 패키지 프록시 서버입니다. 프록시를 설정하지 않으면 일부 패키지 다운로드가 실패할 수 있습니다.

설치 확인

명령 프롬프트에서 다음 명령어를 입력하여 설치 여부를 확인합니다:
go env
환경 정보가 정상적으로 출력되면 설치가 완료된 것입니다.

모듈 활성화

Go 1.11 버전 이상에서는 모듈을 활성화해야 합니다:
set GO111MODULE=on

1.3 개발 환경 설정

Go 개발에常用的 IDE로는 VSCode와 GoLand가 있습니다. VSCode를 사용하는 경우 확장 프로그램)에서 Go 확장 프로그램을 설치합니다.

1.4 첫 번째 프로그램

package main

import "fmt"

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

2. 기본 문법

2.1 변수 선언

변수의 표준 형식: var 변수명 타입

변수가 차지하는 메모리 크기는 변수의 타입에 의해 결정됩니다.

package main

import "fmt"

func main() {
    var username string
    fmt.Println("이름을 입력하세요:")
    fmt.Scanln(&username)
    fmt.Println("환영합니다, " + username + "님!")
}

2.2 빌드 및 패키징

작성한 프로그램을 배포하려면 빌드 작업이 필요합니다. Go는 다양한 플랫폼의 실행 파일로 패키징할 수 있습니다.

// Windows 실행 파일 빌드
set GOOS=windows
set GOARCH=amd64
go build -o bin/application.exe main.go

// Linux 실행 파일 빌드
set GOOS=linux
set GOARCH=amd64
go build -o bin/application main.go

// macOS 실행 파일 빌드
set GOOS=darwin
set GOARCH=amd64
go build -o bin/application_mac main.go

2.3 데이터 타입

타입 분류

  • 숫자 타입: 정수형,浮動小数点型
  • 불리언 타입: true와 false
  • 문자 타입: byte(uint8), rune(int32)
  • 문자열 타입: string
  • 기타: 배열, 포인터, 구조체, 채널, 함수, 슬라이스, any, 맵

타입 별칭 정의

type customInt int

숫자 타입 상세

정수형은 부호 있는 정수와 부호 없는 정수로 나뉩니다:

  • 부호 있음: int, int8, int16, int32, int64
  • 부호 없음: uint, uint8, uint16, uint32, uint64, uintptr

uintptr은 포인터 값을 저장하는 데 사용되며, Go와 C 함수 또는 운영체제 인터페이스 상호작용 시底层 프로그래밍에서 필요합니다.

浮動小数点型: float32, float64. 출력 시 자리수 제한 가능 (예: fmt.Printf("%.5f", value))

불리언 타입

불리언 타입은 true와 false 값만 가지며, 산술 연산이나 타입 변환에 참여할 수 없습니다.

문자 타입

  • uint8 (byte): ASCII 문자 표현
  • rune: Unicode 문자 표현 (다국어 문자 처리 시 필요, int32와 동등)

ASCII는 128개의 문자를 정의하며, Unicode는 ASCII의 상위 집합입니다.

타입 추론 및 변수 선언

:=(short variable declaration)를 사용하면 우측 값의 타입을 자동으로 추론합니다. 초기화하지 않은 변수는 제로 값(숫자: 0, 불리언: false, 문자열: "")을 할당받습니다.

package main

import (
    "fmt"
)

func main() {
    // 단일 변수 선언
    var num1 int = 10

    // 다중 변수 선언
    var num2, num3 int = 20, 30

    // 그룹 변수 선언
    var (
        num4 int    = 40
        num5 int    = 50
        text string = "sample"
    )

    // 간소화 선언
    greeting := "hello"

    fmt.Println(num1, num2, num3, num4, num5, text, greeting)
}

상수

const 키워드로 상수를 선언하며, 선언 시 반드시 값을 할당해야 하고 이후 변경이 불가능합니다.

// 기본 상수 선언
const pi = 3.14159

// 타입 지정 상수
const speed int = 300000

// 상수 표현식
const secondsInHour = 60 * 60

// 열거형 효과 (상수 그룹)
const (
    statusActive = 1
    statusInactive = 2
)

타입 변환

Go에서 기본 타입 간의 명시적 변환이 필요합니다:

destinationType(expression)
예: float64(10), int32(value)

서로 호환되지 않는 타입 간의 변환은 불가능하며, 타입 별칭 사용 시 호환성에 주의해야 합니다.

2.4 연산자

산술 연산자

  • +: 加法
  • -: 減法
  • *: 乘法
  • /: 除法
  • %: 나머지

대입 연산자

  • =: 할당
  • +=, -=, *=, /=, %=: 복합 할당

논리 연산자

  • &&: 논리 AND
  • ||: 논리 OR
  • !: 논리 NOT

비교 연산자

  • ==: 같다
  • <=: 작거나 같다
  • >=: 크거나 같다
  • !=: 다르다
  • <: 작다
  • >: 크다

비트 연산자

  • &: 비트 AND
  • |: 비트 OR
  • ^: 비트 XOR
  • <<: 좌측 시프트
  • >: 우측 시프트
  • &^: 비트 클리어

비트 클리어 연산자는 특정 비트를 0으로 설정하는 데 사용됩니다:

package main

import "fmt"

func main() {
    a := 0b11001100
    b := 0b00110011

    result := a &^ b

    fmt.Printf("결과: %08b\n", result)
    fmt.Println("결과:", result)
}

기타 연산자

  • &: 주소 연산자
  • *: 역참조 연산자
  • ++: 증가
  • --: 감소

2.5 함수

함수는 함수명, 매개변수 목록, 반환 타입, 함수 본문으로 구성됩니다.

기본 함수 정의

func sumValues(x int, y int) int {
    return x + y
}

다중 반환값

Go 함수는 0개, 1개 또는 여러 개의 값을 반환할 수 있습니다:

func calculateValues(a int, b int) (int, int) {
    sum := a + b
    diff := a - b
    return sum, diff
}

명명된 반환값

반환 값을 명명하면 함수 내부에서 지역 변수로 사용할 수 있습니다:

func computeArea(width, height int) (area int) {
    area = width * height
    return
}

빈 반환문

func returnValues(p, q int) (x, y int) {
    x = p
    y = q
    return
}

값에 의한 전달

func increaseCounter(counter int) {
    counter++
}

2.6 조건문

if 문

if condition {
    // 실행 코드
} else if anotherCondition {
    // 실행 코드
} else {
    // 실행 코드
}

switch 문

switch value {
case value1:
    // 실행 코드
case value2:
    // 실행 코드
default:
    // 실행 코드
}

6월 12일 16:48에 게시됨