단방향 채널 (Unidirectional Channels)
기본적으로 채널은 양방향 (bidirectional) 이며 읽기 및 쓰기가 모두 가능합니다. 때로는 채널의 사용을 제한해야 할 필요가 있습니다. 예를 들어, 특정 함수 내에서 채널에 쓰기만 가능하거나 읽기만 가능하도록 보장해야 할 수 있습니다. 이를 어떻게 달성할 수 있을까요?
초기화하기 전에 사용이 제한된 채널을 명시적으로 선언할 수 있습니다.
쓰기 전용 채널 (Write-only Channel)
쓰기 전용 채널이란 특정 함수 내에서 해당 채널에 쓰기만 가능하고 읽을 수는 없음을 의미합니다. int 타입의 쓰기 전용 채널을 선언하고 사용하는 예는 다음과 같습니다:
package main
import "fmt"
func writeOnly(ch chan<- int) {
ch <- 10
fmt.Println("Data written to channel")
}
func main() {
ch := make(chan int, 1)
writeOnly(ch)
fmt.Println("Data received:", <-ch)
}
다음 명령어를 사용하여 프로그램을 실행합니다:
go run channel.go
프로그램 출력 결과는 다음과 같습니다:
Data written to channel
Data received: 10
이 예시에서 writeOnly 함수는 채널을 쓰기 전용으로 제한합니다.
읽기 전용 채널 (Read-only Channel)
읽기 전용 채널이란 특정 함수 내에서 해당 채널에서 읽기만 가능하고 쓸 수는 없음을 의미합니다. int 타입의 읽기 전용 채널을 선언하고 사용하는 예는 다음과 같습니다:
package main
import "fmt"
func readOnly(ch <-chan int) {
fmt.Println("Data received from channel:", <-ch)
}
func main() {
ch := make(chan int, 1)
ch <- 20
readOnly(ch)
}
다음 명령어를 사용하여 프로그램을 실행합니다:
go run channel.go
프로그램 출력 결과는 다음과 같습니다:
Data received from channel: 20
이 예시에서 readOnly 함수는 채널을 읽기 전용으로 제한합니다.
쓰기 전용 및 읽기 전용 채널 결합
쓰기 전용 채널과 읽기 전용 채널을 결합하여 제한된 채널을 통해 데이터가 어떻게 흐르는지 시연할 수 있습니다:
package main
import "fmt"
func writeOnly(ch chan<- int) {
ch <- 30
fmt.Println("Data written to channel")
}
func readOnly(ch <-chan int) {
fmt.Println("Data received from channel:", <-ch)
}
func main() {
ch := make(chan int, 1)
writeOnly(ch)
readOnly(ch)
}
다음 명령어를 사용하여 프로그램을 실행합니다:
go run channel.go
프로그램 출력 결과는 다음과 같습니다:
Data written to channel
Data received from channel: 30
이 예제는 쓰기 전용 채널이 어떻게 데이터를 읽기 전용 채널로 전달할 수 있는지 보여줍니다.