프로그램언어 고(Go)의 채널 기본 사용법
프로그램언어 고(Go)의 채널 기본 사용법
package main
import "fmt"
func main() {
// 채널 선언
ch := make(chan int)
// Goroutine에서 채널로 데이터 보내기
go func() {
ch <- 1
}()
// 채널로부터 데이터 받기
i := <-ch
fmt.Println(i)
}
고(Go)언어의 채널(channel)은 고루틴간에 데이터를 주고받을 수 있는 통로역할을 합니다.
채널을 선언할 때 make 함수를 사용하여 선언합니다.
ch := make(chan int)
위와 같이 선언하면 int 형식의 데이터를 주고받을 수 있는 채널이 생성됩니다.
채널로 데이터를 보내기 위해서는 <- 연산자를 사용합니다.
ch <- 1
위 코드는 채널 ch에 1이라는 int형 데이터를 보내는 코드입니다.
채널로부터 데이터를 받기 위해서도 <- 연산자를 사용합니다.
i := <-ch
위 코드는 채널 ch로부터 데이터를 받아 i 변수에 저장하는 코드입니다.
채널을 사용할 때 주의할 점은, 데이터를 보내는 쪽과 받는 쪽이 동기화되어 있어야합니다.
즉, 데이터를 보내기 전에 먼저 받으려고 하면 에러가 납니다.
그리고 데이터를 받기 전에 먼저 보내려고 하면 에러가 납니다.
따라서 보통 별도의 고루틴에서 데이터를 보내고, 메인 고루틴에서 받거나 반대 경우도 많습니다.
// 별도 고루틴에서 데이터 보내기
go func() {
ch <- 1
}()
// 메인 고루틴에서 데이터 받기
i := <-ch
위 코드처럼 별도 고루틴과 메인 고루틴이 채널을 사용하여 동기화하면 데이터 전송이 가능합니다.
이렇게 고(Go)언어의 채널은 고루틴간 통신에 있어 아주 중요한 역할을 하고 있습니다.
채널을 잘 활용하면 복잡한 고루틴간 통신도 비교적 쉽고 효과적으로 구현할 수 있습니다.
앞으로 더 많이 사용해보시고 익혀나가시길 바랍니다.
프로그램언어 고(Go)에서의 채널을 사용한 데이터 전송
프로그램언어 고(Go)에서의 채널을 사용한 데이터 전송
프로그램 언어 Go에서 채널은 고루틴간에 데이터를 안전하게 전송할 수 있는 통로입니다.
채널은 make를 사용하여 생성할 수 있습니다.
ch := make(chan int)
위의 코드는 int형 데이터를 전송할 수 있는 채널을 생성합니다.
채널에 데이터를 보내기 위해서는 ch <- 3 과 같이 사용합니다. 여기서 3은 채널로 보내지는 데이터입니다.
func sender(ch chan int) {
ch <- 3 // 채널로 데이터 보내기
}
채널로부터 데이터를 받기 위해서는 num := <-ch 와 같이 사용합니다. 여기서 num은 채널에서 읽어온 데이터가 저장되는 변수입니다.
func receiver(ch chan int) {
num := <-ch // 채널에서 데이터 받기
fmt.Println(num)
}
main 함수에서는 고루틴을 사용하여 별도의 센더, 리시버 함수를 동시에 실행할 수 있습니다.
func main() {
ch := make(chan int)
go sender(ch)
go receiver(ch)
time.Sleep(time.Second)
}
위의 코드에서 sender가 채널로 데이터를 보내고, receiver가 채널로부터 데이터를 받아서 처리하는 방식으로 동작합니다.
채널을 사용하면 이런식으로 고루틴간 데이터 전송이 가능하고, 데이터 경쟁상태가 발생하지 않기 때문에 안전하게 처리할 수 있습니다.
이상으로 프로그램언어 Go에서의 채널을 사용한 데이터 전송에 대해 설명드렸습니다. 더 자세한 사항이 필요하시면 문의 부탁드립니다.
프로그램언어 고(Go)에서의 채널 선택(Select) 사용법
프로그램언어 고(Go)에서의 채널 선택(Select) 사용법
Go언어의 채널 선택(Select)은 복수의 채널의 통신을 위해 사용합니다. 하나의 Goroutine이 복수의 채널과 통신할 때, 어느 채널에서 값이 올지 모르는 상황에서 유용합니다.
예를 들어 3개의 채널(ch1, ch2, ch3)가 있을 때, 이 중 하나의 채널에서 값이 전달되기를 기다려야 할 경우가 있습니다. 이때 채널 선택을 사용합니다.
package main
import "fmt"
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
ch3 := make(chan int)
// 복수의 채널 생성
select {
case num1 := <-ch1:
fmt.Println("ch1", num1)
case num2 := <-ch2:
fmt.Println("ch2", num2)
case num3 := <-ch3:
fmt.Println("ch3", num3)
default:
fmt.Println("no channels ready")
}
// select문을 사용하여 채널 선택
}
select문 안에 case문들을 나열합니다. case문에는 각 채널의 통신 코드를 넣습니다.
그런 다음 실행중에 이 채널들 중 데이터가 도착하는 채널의 case문 부분이 실행됩니다.
위 예제의 경우 ch1, ch2, ch3 채널 중 하나가 값을 보내면 그 채널의 case문이 실행되어 값을 출력합니다.
default 문은 모든 채널이 비어있을 때 실행됩니다.
채널 선택은 동기적으로 실행되므로 복수의 채널 선택 시 block이 되지 않습니다.
이를 통해 복수의 채널을 동시에 감시할 수 있고, 값 전달 채널을 선택하는 효과를 얻습니다.
Goroutine간 복잡한 통신을 구현할 때 유용하게 사용할 수 있습니다.
프로그램언어 고(Go)에서의 범위와 채널(Range and Channels) 이해하기
프로그램언어 고(Go)에서의 범위와 채널(Range and Channels) 이해하기
프로그램언어 고(Go)에서의 범위와 채널(Range and Channels)에 대해 설명드리겠습니다.
Go언어에서 범위(Range)는 숫자, 문자 등의 연속된 값들의 집합을 표현하는 데이터 타입입니다.
예를들어 다음과 같은 syntax를 사용하여 범위를 정의할 수 있습니다.
range1 := 1..5 // 1, 2, 3, 4, 5
range2 := 'a'..'f' // 'a', 'b', 'c', 'd', 'e', 'f'
위 예제에서 range1은 1부터 5까지의 정수 범위이고, range2는 'a'부터 'f'까지의 문자 범위입니다.
범위는 for문과 함께 자주 사용되어 반복 실행을 위한 값의 집합을 제공합니다.
for i := range range1 {
println(i)
}
for char := range range2 {
printf("%c ", char)
}
Go언어의 채널(Channel)은 고루틴간의 통신을 위한 패스웨이 역할을 합니다.
채널을 정의하려면 chan 키워드를 사용합니다.
ch := make(chan int) // 정수를 전송할 채널
위 예제 코드는 int형 데이터를 주고받을 수 있는 채널을 생성합니다.
채널을 통해 데이터를 보내려면 <- 연산자를 사용합니다.
ch <- 10 // 채널 ch에 정수 10을 보냄
채널로부터 데이터를 받으려면 <- 연산자의 반대편에 변수를 지정합니다.
num := <-ch // 채널 ch에서 데이터를 받아 num에 저장
이처럼 Go의 채널은 고루틴 간 병행성 프로그래밍을 위한 필수 기능을 제공합니다.
프로그램언어 고(Go)에서의 채널 동기화 사용법
프로그램언어 고(Go)에서의 채널 동기화 사용법
프로그램언어 고(Go)에서 채널 동기화를 사용하는 방법에 대해 구체적인 예제와 함께 설명드리겠습니다.
package main
import "fmt"
func main() {
c := make(chan int)
// goroutine을 실행하여 channel에 값을 보냄
go func() {
c <- 42
}()
// <-c를 통해 channel로부터 값을 읽어옴
// 이 때 해당 goroutine이 값을 보내기 전까지는 여기서 대기
fmt.Println(<-c)
}
위의 예제에서 보시다시피, main goroutine은 c 채널로부터 값을 읽어오기 위해 <-c 식을 사용합니다. 이 때 해당 채널에 값이 없다면(goroutine이 아직 값을 보내지 않았다면) 이 식은 값이 도착할 때까지 계속 기다립니다. 즉, <-c 표현식을 사용하는 것이 바로 Go의 채널에서 동기화를 구현하는 기본적인 방법입니다. main goroutine과 다른 goroutine 간에 이러한 채널 통신을 사용하면 동기화가 가능합니다.