[go] Go 언어로 충돌 감지와 처리 구현하기

Go 언어는 안전하고 효율적인 프로그래밍을 위한 강력한 기능들을 제공합니다. 충돌 감지 및 처리는 이러한 기능 중 하나입니다. 이 글에서는 Go 언어를 사용하여 충돌을 감지하고 처리하는 방법을 알아보겠습니다.

충돌 감지하기

Go 언어에서 충돌을 감지하기 위해서는 sync 패키지의 Mutex 구조체를 사용할 수 있습니다. Mutex는 상호 배제(mutual exclusion)를 위한 동기화 기능을 제공합니다. 다음은 충돌 감지를 위한 예시 코드입니다.

package main

import (
	"fmt"
	"sync"
)

var (
	counter   = 0
	counterMu sync.Mutex
)

func increment() {
	counterMu.Lock()
	defer counterMu.Unlock()
	counter++
}

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			increment()
		}()
	}

	wg.Wait()
	fmt.Println("Counter:", counter)
}

위 코드는 counter 변수를 여러 고루틴에서 동시에 증가시키는 예시입니다. sync.Mutex를 사용하여 increment 함수의 실행 중간에 다른 고루틴이 접근하지 못하도록 잠금을 설정합니다.

충돌 처리하기

충돌이 발생했을 때, Go 언어에서는 panicrecover를 활용하여 충돌을 처리할 수 있습니다. panic은 현재 고루틴의 실행을 중단시키고, recoverpanic으로 인해 중단된 고루틴을 다시 실행시킵니다. 다음은 충돌 처리를 위한 예시 코드입니다.

package main

import (
	"fmt"
	"sync"
)

func safelyDivide(a, b float64) float64 {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered from panic:", r)
		}
	}()

	return a / b
}

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			result := safelyDivide(10, float64(i))
			fmt.Println("Result:", result)
		}()
	}

	wg.Wait()
}

위 코드는 safelyDivide 함수에서 0으로 나눌 때 panic을 일으키고, 이를 recover 함수로 처리하는 예시입니다. recover 함수를 사용하여 panic이 발생한 경우 오류 메시지를 출력하고 프로그램이 종료되지 않도록 합니다.

결론

Go 언어는 충돌 감지와 처리를 위한 여러 기능들을 제공합니다. sync.Mutex를 사용하여 충돌 감지를 할 수 있고, panicrecover를 사용하여 충돌을 처리할 수 있습니다. 이러한 기능들을 적절히 활용하여 안전하고 효율적인 프로그래밍을 할 수 있습니다.

참고 자료