Compare commits
No commits in common. "d8d4475becc15736676069e2289965e8b605bbb7" and "29620426c2563ae32d9a449c4eaf34d31b6b0e22" have entirely different histories.
d8d4475bec
...
29620426c2
|
@ -1,25 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import "runtime"
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// chan是channel的缩写,channel是一种特殊的类型
|
|
||||||
// chan是一个关键字
|
|
||||||
// chan和map , slice一样,是引用类型,
|
|
||||||
// 参数传递时,传递的是地址
|
|
||||||
// chan的零值是nil
|
|
||||||
// 两个相同类型的channel可以用==比较,
|
|
||||||
// 如果当他们引用的是同一个channel对象,或者都是nil,那么结果为true
|
|
||||||
ch := make(chan int)
|
|
||||||
ch <- 2
|
|
||||||
go forEach(ch)
|
|
||||||
runtime.GOMAXPROCS(8)
|
|
||||||
forEach(nil)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func forEach(ch chan int) {
|
|
||||||
for {
|
|
||||||
println(<-ch)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -21,7 +21,6 @@ func main() {
|
||||||
const n = 45
|
const n = 45
|
||||||
fibN := fib(n) // slow
|
fibN := fib(n) // slow
|
||||||
fmt.Printf("\rFibonacci(%d) = %d\n", n, fibN)
|
fmt.Printf("\rFibonacci(%d) = %d\n", n, fibN)
|
||||||
any
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func spinner(delay time.Duration) {
|
func spinner(delay time.Duration) {
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
// Channels 可以用于多个goroutine之间的数据交换
|
|
||||||
func main() {
|
|
||||||
natural := make(chan int)
|
|
||||||
square := make(chan int)
|
|
||||||
|
|
||||||
// counter
|
|
||||||
go func() {
|
|
||||||
for x := 0; x <= 100; x++ {
|
|
||||||
natural <- x
|
|
||||||
}
|
|
||||||
close(natural) // 关闭channel
|
|
||||||
}()
|
|
||||||
|
|
||||||
// squarer
|
|
||||||
go func() {
|
|
||||||
for {
|
|
||||||
x, ok := <-natural
|
|
||||||
if !ok {
|
|
||||||
break // channel关闭,跳出循环
|
|
||||||
}
|
|
||||||
square <- x * x
|
|
||||||
}
|
|
||||||
close(square)
|
|
||||||
}()
|
|
||||||
|
|
||||||
// printer (in main goroutine)
|
|
||||||
for {
|
|
||||||
x, ok := <-square
|
|
||||||
if !ok {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
println(x)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,36 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 不带缓存的channel
|
|
||||||
// 无缓存的channel,发送端发送数据,必须等待接收端接收数据
|
|
||||||
// 同样的, 接收数据,也必须等待发送端发送数据
|
|
||||||
// 如果有一方发了数据,但是另一方没有接收,那么就会发生阻塞
|
|
||||||
// 如果要接收数据,但是没有数据发送,那么也会发生阻塞
|
|
||||||
func main() {
|
|
||||||
ch := make(chan int)
|
|
||||||
// 模拟发送数据
|
|
||||||
go func() {
|
|
||||||
// 模拟耗时操作
|
|
||||||
time.Sleep(5 * time.Second)
|
|
||||||
ch <- 1
|
|
||||||
println("发送数据")
|
|
||||||
}()
|
|
||||||
|
|
||||||
// 程序阻塞, 等待接受数据
|
|
||||||
println("接收数据1", <-ch)
|
|
||||||
|
|
||||||
// 模拟接收数据
|
|
||||||
go func() {
|
|
||||||
// 此程序会阻塞, 因为没有数据发送
|
|
||||||
println("接收数据2", <-ch)
|
|
||||||
}()
|
|
||||||
// 模拟耗时
|
|
||||||
time.Sleep(3 * time.Second)
|
|
||||||
ch <- 2
|
|
||||||
// 模拟耗时, 等待所有的goroutine执行完毕
|
|
||||||
time.Sleep(3 * time.Second)
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"net"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func echo(c net.Conn, shout string, delay time.Duration) {
|
|
||||||
fmt.Fprintln(c, "\t", strings.ToUpper(shout))
|
|
||||||
time.Sleep(delay)
|
|
||||||
fmt.Fprintln(c, "\t", shout)
|
|
||||||
time.Sleep(delay)
|
|
||||||
fmt.Fprintln(c, "\t", strings.ToLower(shout))
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleConn1(c net.Conn) {
|
|
||||||
input := bufio.NewScanner(c)
|
|
||||||
for input.Scan() {
|
|
||||||
echo(c, input.Text(), 1*time.Second)
|
|
||||||
}
|
|
||||||
// NOTE: ignoring potential errors from input.Err()
|
|
||||||
c.Close()
|
|
||||||
}
|
|
||||||
func main() {
|
|
||||||
conn, err := net.Dial("tcp", "localhost:8000")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
defer conn.Close()
|
|
||||||
go mustCopy(os.Stdout, conn)
|
|
||||||
mustCopy(conn, os.Stdin)
|
|
||||||
}
|
|
Loading…
Reference in New Issue