Golang 참고 자료

유용한 golang 명령어 및 구조

Page content

다음은 기본적인 Go 프로그램 구조, 오류 처리 패턴 및 채널과 goroutine의 비교입니다.

golang 표지 주변의 토끼

Go 언어 체크리스트

기본 문법

패키지 선언

package main

패키지 임포트

import "fmt"
import (
    "fmt"
    "math"
)

메인 함수

func main() {
    // 여기에 코드를 입력하세요
}

변수와 타입

변수 선언

var name string
var age int = 25
x := 10 // 짧은 선언

기본 타입

  • bool
  • string
  • int, int8, int16, int32, int64
  • uint, uint8, uint16, uint32, uint64
  • float32, float64
  • complex64, complex128

제어 구조

if 문

if x > 0 {
    // 코드
} else if x < 0 {
    // 코드
} else {
    // 코드
}

for 루프

for i := 0; i < 10; i++ {
    // 코드
}

range 루프

for index, value := range collection {
    // 코드
}

switch 문

switch variable {
case value1:
    // 코드
case value2:
    // 코드
default:
    // 코드
}

함수

함수 선언

func functionName(param1 type1, param2 type2) returnType {
    // 코드
    return value
}

다중 반환 값

func divideAndRemainder(x, y int) (int, int) {
    return x / y, x % y
}

데이터 구조

배열

var numbers int
numbers := int{1, 2, 3, 4, 5}

슬라이스

slice := []int{1, 2, 3}
slice := make([]int, 3, 5)

m := make(map[string]int)
m["key"] = value

구조체

type Person struct {
    Name string
    Age  int
}
p := Person{Name: "Alice", Age: 30}

메서드

메서드 선언

func (r Rectangle) Area() float64 {
    return r.width * r.height
}

인터페이스

인터페이스 선언

type Shape interface {
    Area() float64
}

동시성

goroutine

go functionName()

채널

ch := make(chan int)
ch <- value  // 전송
value := <-ch  // 수신

오류 처리

오류 확인

if err != nil {
    // 오류 처리
}

defer

defer file.Close()

테스트

테스트 함수

func TestFunction(t *testing.T) {
    // 테스트 코드
}

이 체크리스트는 Go 언어의 가장 중요한 구성 요소와 명령어를 다룹니다. 기본 문법, 제어 구조, 함수, 데이터 구조, 메서드, 인터페이스, 동시성 원시 요소 및 오류 처리가 포함되어 있습니다. Go는 간결성과 가독성을 중시하므로, 이러한 구조는 효율적이고 명확한 Go 코드를 작성하는 데 기초가 됩니다.

Go에서의 오류 처리

Go에서의 오류 처리는 명확하고 명시적이며, 명확성과 견고성을 강조합니다. Go에서 오류를 처리하는 주요 기술은 다음과 같습니다:

  1. 값으로 오류 반환: 실패할 수 있는 함수는 마지막 반환 값으로 오류를 반환해야 합니다. 예를 들어:
func Hello(name string) (string, error) {
    if name == "" {
        return "", errors.New("empty name")
    }
    message := fmt.Sprintf("Hi, %v. Welcome!", name)
    return message, nil
}
  1. 항상 오류 확인: 오류를 반환하는 함수를 호출한 후, 즉시 오류가 nil이 아닌지 확인해야 합니다. 예를 들어:
result, err := SomeFunction()
if err != nil {
    // 오류 처리
    log.Fatal(err)
}
  1. 오류 래핑 사용: 오류를 호출 스택 상위로 전달할 때, %w 구문을 사용하여 fmt.Errorf()로 추가 맥락을 제공하는 것이 좋습니다. 예를 들어:
f, err := os.Open(path)
if err != nil {
    return nil, fmt.Errorf("open failed: %w", err)
}
  1. defer로 정리: 오류가 발생하더라도 자원이 올바르게 닫히거나 정리되도록 defer를 사용하세요.

  2. 커스텀 오류 타입 생성: 더 상세한 오류 정보를 제공하기 위해 error 인터페이스를 구현한 커스텀 오류 타입을 사용하세요.

  3. errors 패키지 사용: errors.New()와 같은 함수를 사용하여 간단한 오류 메시지를 생성하고, errors.Is() 또는 errors.As()를 사용하여 오류 타입 확인 및 변환을 수행하세요.

  4. panic 사용 피하기: panic은 정말 복구 불가능한 상황에만 예약하세요. 일반적인 오류 처리는 반환 값을 사용하세요.

  5. 명확한 오류 정보 제공: 오류 메시지가 명확하고 정보가 풍부하도록 하여 디버깅 및 문제 해결에 도움이 되도록 하세요.

이러한 실천을 따르면 오류를 효과적으로 처리하고 코드의 명확성을 유지하는 견고한 Go 프로그램을 만들 수 있습니다.

Go에서 Goroutine과 Channel 사용에 대한 최선의 실천 방식

Goroutine의 효율적인 사용

  1. 과도한 Goroutine 생성 피하기: 작업의 성격과 병렬 실행에 유리한지 고려하여 Goroutine을 신중하게 생성하세요.

  2. 적절한 동기화: Goroutine을 효과적으로 관리하고 자원 낭비를 방지하기 위해 채널 또는 WaitGroup과 같은 동기화 메커니즘을 사용하세요.

  3. 작업 성격 고려: Goroutine을 사용하기 전에 작업이 실제로 병렬 실행에 유리한지 평가하세요.

채널의 효과적인 사용

  1. 적절한 채널 유형 선택: 동기화를 위해 비버퍼드 채널을 사용하고, 전송 및 수신 작업을 분리해야 할 경우 버퍼드 채널을 사용하세요.

  2. 버퍼 용량 고려: 버퍼드 채널을 사용할 경우 버퍼 크기를 신중하게 고려하여 성능과 자원 사용을 균형 있게 유지하세요.

  3. 채널을 적절히 닫기: 더 이상 데이터를 전송하지 않을 경우 채널을 닫아야 하며, 이는 데드락과 자원 누수를 방지합니다.

동시성 패턴

  1. 워커 풀 패턴: 작업 분배 및 결과 수집을 위해 Goroutine과 채널을 사용하여 워커 풀을 구현하세요.

  2. 생산자-소비자 패턴: 채널을 통해 데이터 흐름을 조절하는 생산자와 소비자 Goroutine을 사용하세요.

오류 처리 및 자원 관리

  1. defer로 정리: 오류가 발생하더라도 자원이 올바르게 정리되도록 defer 문을 사용하세요.

  2. Panic 처리: 장기 실행 Goroutine에서 recover()를 사용하여 단일 Goroutine의 panic이 전체 프로그램을 중단하지 않도록 하세요.

커뮤니케이션 및 동기화

  1. 공유 메모리보다 채널 사용: Goroutine 간 커뮤니케이션을 위해 채널을 사용하여 레이스 조건을 피하고 동기화를 간소화하세요.

  2. 다중 채널 처리를 위해 select 사용: 여러 채널 작업을 동시에 처리하기 위해 select 문을 사용하세요.

성능 고려사항

  1. 동시 작업 제한: 자원 고갈을 방지하기 위해 세마포어 또는 워커 풀을 사용하여 동시 작업 수를 제한하세요.

  2. 조기 최적화 피하기: 동시성 최적화를 적용하기 전에 코드를 프로파일링하여 병목 현상을 확인하세요.

테스트 및 디버깅

  1. 레이스 감지기 사용: 정기적으로 -race 플래그와 함께 테스트를 실행하여 데이터 레이스를 감지하세요.

  2. 동시성 테스트 작성: 동시성 코드 경로를 특별히 테스트하여 신뢰성을 보장하세요.

이러한 최선의 실천 방식을 따르면 Go의 동시성 모델을 효과적으로 활용하여 프로그램을 더 효율적이고 유지보수가 용이하며, 일반적인 동시성 관련 문제에 덜 노출된 상태로 만들 수 있습니다.

다른 기술 블로그 기사를 참조하세요.

Linux에서 golang 업그레이드

  1. 새 버전 다운로드: https://go.dev/doc/install
  2. 이전 버전 제거:
sudo rm -rf /usr/local/go
  1. 새 버전 설치:
cd Downloads
sudo tar -C /usr/local -xzf go1.24.3.linux-amd64.tar.gz

유용한 링크