Channel Directions in Kotlin
In Kotlin, we can use coroutines and channels to achieve similar functionality to Go’s goroutines and channels. Here’s how we can implement channel directions:
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
// This `ping` function only accepts a channel for sending
// values. It would be a compile-time error to try to
// receive on this channel.
suspend fun ping(pings: SendChannel<String>, msg: String) {
pings.send(msg)
}
// The `pong` function accepts one channel for receives
// (`pings`) and a second for sends (`pongs`).
suspend fun pong(pings: ReceiveChannel<String>, pongs: SendChannel<String>) {
val msg = pings.receive()
pongs.send(msg)
}
fun main() = runBlocking {
val pings = Channel<String>()
val pongs = Channel<String>()
launch { ping(pings, "passed message") }
launch { pong(pings, pongs) }
println(pongs.receive())
}
When using channels as function parameters in Kotlin, you can specify if a channel is meant to only send or receive values. This specificity increases the type-safety of the program.
In this example, we define two suspend functions:
ping
: This function only accepts aSendChannel<String>
, which means it can only send values to the channel.pong
: This function accepts aReceiveChannel<String>
for receiving and aSendChannel<String>
for sending.
In the main
function, we create two channels using Channel<String>()
. We then launch two coroutines:
- One that calls
ping
to send a message. - Another that calls
pong
to receive the message frompings
and send it topongs
.
Finally, we print the received message from the pongs
channel.
To run this program:
$ kotlinc -cp kotlinx-coroutines-core-1.5.2.jar ChannelDirections.kt -include-runtime -d ChannelDirections.jar
$ java -jar ChannelDirections.jar
passed message
Note: You’ll need to have the kotlinx-coroutines library in your classpath to run this code.
This example demonstrates how Kotlin’s channels can be used to safely communicate between coroutines, similar to Go’s channel directions.