[go] 구조체(struct)를 사용한 비동기 처리 방법

Go 언어에서는 비동기 처리를 위해 goroutinechannel을 주로 사용합니다. 그러나 때로는 구조체(struct)를 사용하여 비동기 작업을 처리하는 것이 유용할 수 있습니다. 이번 블로그에서는 구조체를 사용하여 비동기 처리를 하는 방법에 대해서 알아보겠습니다.

구조체를 사용한 비동기 처리의 이점

구조체를 사용하여 비동기 처리를 할 경우 몇 가지 이점이 있습니다.

  1. 상태 관리: 구조체는 필드를 가지고 있기 때문에 비동기 작업의 상태를 간단하게 관리할 수 있습니다.
  2. 데이터 공유: 여러 개의 메서드에서 동일한 데이터를 공유하기 쉽습니다. 구조체 내부의 필드를 사용하여 데이터를 공유할 수 있습니다.
  3. 코드 구조화: 비동기 작업들을 구조체의 메서드로 정의하여 코드를 구조화할 수 있습니다. 이렇게 하면 코드의 가독성과 유지보수성을 높일 수 있습니다.

구조체를 사용한 비동기 처리 예제

아래는 구조체를 사용하여 비동기 작업을 처리하는 예제 코드입니다.

package main

import (
    "fmt"
    "time"
)

type AsyncProcess struct {
    data      string
    done      chan bool
    result    string
}

func (a *AsyncProcess) Start() {
    go func() {
        // 비동기 작업 처리
        time.Sleep(time.Second) // 비동기 작업 대신 1초 대기

        // 결과값 설정
        a.result = "작업이 완료되었습니다."

        // 작업 완료 신호 전송
        a.done <- true
    }()
}

func main() {
    process := &AsyncProcess{
        data: "비동기 작업에 필요한 데이터",
        done: make(chan bool),
    }

    process.Start()

    <-process.done // 작업 완료 대기

    fmt.Println(process.result) // 결과 출력
}

위 예제 코드에서 AsyncProcess라는 구조체를 정의하고 Start라는 메서드를 추가했습니다. Start 메서드는 비동기 작업을 수행하는 goroutine을 생성하고 작업이 완료될 때까지 대기합니다. 작업이 완료되면 결과값을 설정하고 done 채널을 통해 완료 신호를 전송합니다.

main 함수에서는 AsyncProcess 구조체를 생성하고 작업을 시작한 뒤 작업 완료 대기를 수행하고 결과를 출력합니다.

결론

구조체를 사용하여 비동기 처리를 할 수 있는 이점과 예제 코드를 살펴봤습니다. 구조체를 사용하면 비동기 작업의 관리, 데이터 공유, 코드 구조화를 더욱 효과적으로 할 수 있습니다. 다양한 상황에서 구조체를 활용하여 비동기 처리를 해보세요.