Golang 참고 자료
유용한 golang 명령어 및 구조
다음은 기본적인 Go 프로그램 구조, 오류 처리 패턴 및 채널과 goroutine의 비교입니다.
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에서 오류를 처리하는 주요 기술은 다음과 같습니다:
- 값으로 오류 반환: 실패할 수 있는 함수는 마지막 반환 값으로 오류를 반환해야 합니다. 예를 들어:
func Hello(name string) (string, error) {
if name == "" {
return "", errors.New("empty name")
}
message := fmt.Sprintf("Hi, %v. Welcome!", name)
return message, nil
}
- 항상 오류 확인: 오류를 반환하는 함수를 호출한 후, 즉시 오류가 nil이 아닌지 확인해야 합니다. 예를 들어:
result, err := SomeFunction()
if err != nil {
// 오류 처리
log.Fatal(err)
}
- 오류 래핑 사용: 오류를 호출 스택 상위로 전달할 때,
%w
구문을 사용하여fmt.Errorf()
로 추가 맥락을 제공하는 것이 좋습니다. 예를 들어:
f, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("open failed: %w", err)
}
-
defer로 정리: 오류가 발생하더라도 자원이 올바르게 닫히거나 정리되도록
defer
를 사용하세요. -
커스텀 오류 타입 생성: 더 상세한 오류 정보를 제공하기 위해
error
인터페이스를 구현한 커스텀 오류 타입을 사용하세요. -
errors 패키지 사용:
errors.New()
와 같은 함수를 사용하여 간단한 오류 메시지를 생성하고,errors.Is()
또는errors.As()
를 사용하여 오류 타입 확인 및 변환을 수행하세요. -
panic 사용 피하기:
panic
은 정말 복구 불가능한 상황에만 예약하세요. 일반적인 오류 처리는 반환 값을 사용하세요. -
명확한 오류 정보 제공: 오류 메시지가 명확하고 정보가 풍부하도록 하여 디버깅 및 문제 해결에 도움이 되도록 하세요.
이러한 실천을 따르면 오류를 효과적으로 처리하고 코드의 명확성을 유지하는 견고한 Go 프로그램을 만들 수 있습니다.
Go에서 Goroutine과 Channel 사용에 대한 최선의 실천 방식
Goroutine의 효율적인 사용
-
과도한 Goroutine 생성 피하기: 작업의 성격과 병렬 실행에 유리한지 고려하여 Goroutine을 신중하게 생성하세요.
-
적절한 동기화: Goroutine을 효과적으로 관리하고 자원 낭비를 방지하기 위해 채널 또는 WaitGroup과 같은 동기화 메커니즘을 사용하세요.
-
작업 성격 고려: Goroutine을 사용하기 전에 작업이 실제로 병렬 실행에 유리한지 평가하세요.
채널의 효과적인 사용
-
적절한 채널 유형 선택: 동기화를 위해 비버퍼드 채널을 사용하고, 전송 및 수신 작업을 분리해야 할 경우 버퍼드 채널을 사용하세요.
-
버퍼 용량 고려: 버퍼드 채널을 사용할 경우 버퍼 크기를 신중하게 고려하여 성능과 자원 사용을 균형 있게 유지하세요.
-
채널을 적절히 닫기: 더 이상 데이터를 전송하지 않을 경우 채널을 닫아야 하며, 이는 데드락과 자원 누수를 방지합니다.
동시성 패턴
-
워커 풀 패턴: 작업 분배 및 결과 수집을 위해 Goroutine과 채널을 사용하여 워커 풀을 구현하세요.
-
생산자-소비자 패턴: 채널을 통해 데이터 흐름을 조절하는 생산자와 소비자 Goroutine을 사용하세요.
오류 처리 및 자원 관리
-
defer로 정리: 오류가 발생하더라도 자원이 올바르게 정리되도록 defer 문을 사용하세요.
-
Panic 처리: 장기 실행 Goroutine에서
recover()
를 사용하여 단일 Goroutine의 panic이 전체 프로그램을 중단하지 않도록 하세요.
커뮤니케이션 및 동기화
-
공유 메모리보다 채널 사용: Goroutine 간 커뮤니케이션을 위해 채널을 사용하여 레이스 조건을 피하고 동기화를 간소화하세요.
-
다중 채널 처리를 위해 select 사용: 여러 채널 작업을 동시에 처리하기 위해 select 문을 사용하세요.
성능 고려사항
-
동시 작업 제한: 자원 고갈을 방지하기 위해 세마포어 또는 워커 풀을 사용하여 동시 작업 수를 제한하세요.
-
조기 최적화 피하기: 동시성 최적화를 적용하기 전에 코드를 프로파일링하여 병목 현상을 확인하세요.
테스트 및 디버깅
-
레이스 감지기 사용: 정기적으로 -race 플래그와 함께 테스트를 실행하여 데이터 레이스를 감지하세요.
-
동시성 테스트 작성: 동시성 코드 경로를 특별히 테스트하여 신뢰성을 보장하세요.
이러한 최선의 실천 방식을 따르면 Go의 동시성 모델을 효과적으로 활용하여 프로그램을 더 효율적이고 유지보수가 용이하며, 일반적인 동시성 관련 문제에 덜 노출된 상태로 만들 수 있습니다.
다른 기술 블로그 기사를 참조하세요.
Linux에서 golang 업그레이드
- 새 버전 다운로드: https://go.dev/doc/install
- 이전 버전 제거:
sudo rm -rf /usr/local/go
- 새 버전 설치:
cd Downloads
sudo tar -C /usr/local -xzf go1.24.3.linux-amd64.tar.gz