golang channel example

Example 1: go chanels

ch := make(chan int) // create a channel of type int
ch <- 42             // Send a value to the channel ch.
v := <-ch            // Receive a value from ch

// Non-buffered channels block. Read blocks when no value is available, write blocks until there is a read.

// Create a buffered channel. Writing to a buffered channels does not block if less than <buffer size> unread values have been written.
ch := make(chan int, 100)

close(ch) // closes the channel (only sender should close)

// read from channel and test if it has been closed
v, ok := <-ch

// if ok is false, channel has been closed

// Read from channel until it is closed
for i := range ch {
    fmt.Println(i)
}

// select blocks on multiple channel operations, if one unblocks, the corresponding case is executed
func doStuff(channelOut, channelIn chan int) {
    select {
    case channelOut <- 42:
        fmt.Println("We could write to channelOut!")
    case x := <- channelIn:
        fmt.Println("We could read from channelIn")
    case <-time.After(time.Second * 1):
        fmt.Println("timeout")
    }
}

Example 2: golang channel example

package main

import (
	"fmt"
	"runtime"
)

func main() {
	runtime.GOMAXPROCS(2)

	fullname := make(chan string)

	channel := make(chan int, 3)
	channel <- 2021
	channel <- 2022
	channel <- 2023
	fmt.Println(<-channel)

	go func() {
		fullname <- "john doe"
	}()
	go func() {
		fullname <- "jane doe"
	}()
	go func() {
		fullname <- "jamal"
	}()
	go func() {
		fullname <- "kuya"
	}()

	fmt.Println(<-fullname)
	fmt.Println(<-fullname)
	fmt.Println(<-fullname)
	fmt.Println(<-fullname)
}

Example 3: golang channel

package main

import (
	"encoding/json"
	"fmt"
	"runtime"
	"time"
)

type Profile struct {
	Name string `json:"name"`
	Age  uint   `json:"age"`
}

func Publisher(data string, channel chan interface{}) {
	channel <- string(data)
}

func Subscribe(channel chan interface{}) {
	profile := <-channel
	fmt.Println(profile)
}

func main() {
	// set core max to use for gorutine
	runtime.GOMAXPROCS(2)

	// init compose type data
	profileChannel := make(chan interface{})

	// set value for struct
	var profile Profile
	profile.Name = "john doe"
	profile.Age = 23

	// convert to json
	toJson, _ := json.Marshal(profile)

	// sending channel data
	go Publisher(string(toJson), profileChannel)

	// get channel data
	go Subscribe(profileChannel)

	// delay gorutine 1000 second
	time.Sleep(time.Second * 1)
}

Tags:

Go Example