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
開始執行併發
退出併發
執行完畢。
- 範例&說明
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
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