Golang 참고 자료

유용한 golang 명령어와 구조

Page content

다음은 Go 프로그래밍 언어의 기본적인 프로그램 구조, 오류 처리 패턴, 그리고 채널과 고루틴의 비교입니다.

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
}

동시성

고루틴

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에서 고루틴과 채널 사용의 최선 실천

고루틴의 효율적인 사용

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

  2. 적절한 동기화: 고루틴을 효과적으로 관리하고 리소스 낭비를 방지하기 위해 채널이나 wait groups과 같은 동기화 메커니즘을 사용하세요.

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

채널의 효과적인 사용

  1. 적절한 채널 유형 선택: 동기화에 사용할 경우 비버퍼드 채널을, 전송과 수신 작업을 분리할 필요가 있을 경우 버퍼드 채널을 선택하세요.

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

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

동시성 패턴

  1. 워커 풀 패턴: 고루틴과 채널을 사용하여 효율적인 작업 분배 및 결과 수집을 위한 워커 풀을 구현하세요.

  2. 생산자-소비자 패턴: 채널을 통해 데이터 흐름을 조절하는 생산자와 소비자로 구성된 고루틴을 사용하세요.

오류 처리 및 리소스 관리

  1. 정리 위해 defer 사용: 오류가 발생하더라도 리소스가 올바르게 정리되도록 defer 문을 사용하세요.

  2. 패닉 처리: 장기 실행 고루틴에서 recover()를 사용하여 단일 고루틴의 패닉으로 인해 전체 프로그램이 중단되는 것을 방지하세요.

커뮤니케이션 및 동기화

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

  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

유용한 링크