mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-08-15 02:51:34 +00:00
ch8: fix code format
This commit is contained in:
@@ -4,45 +4,45 @@ clock服務器每一個連接都會起一個goroutine。在本節中我們會創
|
||||
|
||||
```go
|
||||
func handleConn(c net.Conn) {
|
||||
io.Copy(c, c) // NOTE: ignoring errors
|
||||
c.Close()
|
||||
io.Copy(c, c) // NOTE: ignoring errors
|
||||
c.Close()
|
||||
}
|
||||
```
|
||||
|
||||
一個更有意思的echo服務應該模擬一個實際的echo的“迴響”,併且一開始要用大寫HELLO來表示“聲音很大”,之後經過一小段延遲返迴一個有所緩和的Hello,然後一個全小寫字母的hello表示聲音漸漸變小直至消失,像下面這個版本的handleConn(譯註:笑看作者腦洞大開):
|
||||
|
||||
<u><i>gopl.io/ch8/reverb1</i></u>
|
||||
```go
|
||||
gopl.io/ch8/reverb1
|
||||
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))
|
||||
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 handleConn(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()
|
||||
input := bufio.NewScanner(c)
|
||||
for input.Scan() {
|
||||
echo(c, input.Text(), 1*time.Second)
|
||||
}
|
||||
// NOTE: ignoring potential errors from input.Err()
|
||||
c.Close()
|
||||
}
|
||||
```
|
||||
|
||||
我們需要陞級我們的客戶端程序,這樣它就可以發送終端的輸入到服務器,併把服務端的返迴輸出到終端上,這使我們有了使用併發的另一個好機會:
|
||||
|
||||
<u><i>gopl.io/ch8/netcat2</i></u>
|
||||
```go
|
||||
gopl.io/ch8/netcat2
|
||||
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)
|
||||
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)
|
||||
}
|
||||
```
|
||||
|
||||
@@ -74,15 +74,15 @@ $ killall reverb1
|
||||
|
||||
註意客戶端的第三次shout在前一個shout處理完成之前一直沒有被處理,這貌似看起來不是特别“現實”。眞實世界里的迴響應該是會由三次shout的迴聲組合而成的。爲了模擬眞實世界的迴響,我們需要更多的goroutine來做這件事情。這樣我們就再一次地需要go這個關鍵詞了,這次我們用它來調用echo:
|
||||
|
||||
<u><i>gopl.io/ch8/reverb2</i></u>
|
||||
```go
|
||||
gopl.io/ch8/reverb2
|
||||
func handleConn(c net.Conn) {
|
||||
input := bufio.NewScanner(c)
|
||||
for input.Scan() {
|
||||
go echo(c, input.Text(), 1*time.Second)
|
||||
}
|
||||
// NOTE: ignoring potential errors from input.Err()
|
||||
c.Close()
|
||||
input := bufio.NewScanner(c)
|
||||
for input.Scan() {
|
||||
go echo(c, input.Text(), 1*time.Second)
|
||||
}
|
||||
// NOTE: ignoring potential errors from input.Err()
|
||||
c.Close()
|
||||
}
|
||||
```
|
||||
|
||||
|
Reference in New Issue
Block a user