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 언어에서는 panic
과 recover
를 활용하여 충돌을 처리할 수 있습니다. panic
은 현재 고루틴의 실행을 중단시키고, recover
는 panic
으로 인해 중단된 고루틴을 다시 실행시킵니다. 다음은 충돌 처리를 위한 예시 코드입니다.
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
를 사용하여 충돌 감지를 할 수 있고, panic
과 recover
를 사용하여 충돌을 처리할 수 있습니다. 이러한 기능들을 적절히 활용하여 안전하고 효율적인 프로그래밍을 할 수 있습니다.