[Golang] goroutine & channel & select

package main

import (
"fmt"
"time"
)

func main() {
go processSockt()
var input string
fmt.Scanln(&input)
fmt.Println(input)
}

func processSockt(){
var sockets int

for {
sockets++
fmt.Println("請求次數:", sockets)
time.Sleep(time.Second)
}
}

channel

發送數據: 通道變量<-value
接收數據: data, err:= <-ch

ch1 := make(chan int)
ch2 := make(chan string)
ch3 := make(chan interface{}) //任意類型的通道

發送數據: 通道變量<-value
ch1 <- 1
ch2 <- "name"
ch3 <- "hi"

//接收數據: data, err:= <-ch
package main

import "fmt"

func main() {

    ch := make(chan int)

    go func() {
        fmt.Println("開始執行併發")
        ch <- 1
        fmt.Println("退出併發")

    }()
    fmt.Println("等待 goroutine")
    <-ch
    fmt.Println("執行完畢。")
}

顯示如下:

等待 goroutine
開始執行併發
退出併發
執行完畢。
  1. 範例&說明
package main

import "fmt"

func main() {
    //ch1 := make(chan int)
    //ch2 := make(chan string)
    //ch3 := make(chan interface{}) //任意類型的通道

    //發送數據: 通道變量<-value
    //ch1 <- 1
    //ch2 <- "name"
    //ch3 <- "hi"

    //接收數據: data, err:= <-ch

    // 創建通道
    c := make(chan int)

    //併發執行
    go ifunc(c)
    for i := 1; i <= 10; i++{
        // 將數據i發送給通道
        c <- i
    }

    // 通道ifunc結束讀取數據
    c<-100

    //等於ifunc結束
    fmt.Println(<-c)
}

func ifunc(c chan int) {

    // 阻塞等待數據
    for {
        //從通道獲取一個數據
        data := <- c

        // 當取得的數據為100則結束阻塞
        if data == 100{
            break
        }

        // 輸出數據
        fmt.Println(data)
    }
    // 通知main結束
    c<-0
}

顯示結果

1
2
3
4
5
6
7
8
9
10
0

select

select

channel结合select和case

package main

import (
    "fmt"
    "time"
)

func main() {
    ch1:= make(chan string)
    ch2:= make(chan string)

    go server1(ch1)
    go server2(ch2)
    select {
    case s1:= <-ch1:
        fmt.Println(s1)
    case s2 :=<-ch2:
        fmt.Println(s2)

    }
}

func server1(ch chan string){
    time.Sleep(5*time.Second)
    ch <- "server1"
}

func server2(ch chan string) {
    time.Sleep(2 * time.Second)
    ch <- "server2"
}

顯示

server2

發佈留言