mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-08-06 23:41:43 +00:00
ch8: fix code format
This commit is contained in:
@@ -10,17 +10,17 @@ Go語言併沒有提供在一個goroutine中終止另一個goroutine的方法,
|
||||
|
||||
隻要一些小脩改,我們就可以把退出邏輯加入到前一節的du程序。首先,我們創建一個退出的channel,這個channel不會向其中發送任何值,但其所在的閉包內要寫明程序需要退出。我們同時還定義了一個工具函數,cancelled,這個函數在被調用的時候會輪詢退出狀態。
|
||||
|
||||
<u><i>gopl.io/ch8/du4</i></u>
|
||||
```go
|
||||
gopl.io/ch8/du4
|
||||
var done = make(chan struct{})
|
||||
|
||||
func cancelled() bool {
|
||||
select {
|
||||
case <-done:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
select {
|
||||
case <-done:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -29,8 +29,8 @@ func cancelled() bool {
|
||||
```go
|
||||
// Cancel traversal when input is detected.
|
||||
go func() {
|
||||
os.Stdin.Read(make([]byte, 1)) // read a single byte
|
||||
close(done)
|
||||
os.Stdin.Read(make([]byte, 1)) // read a single byte
|
||||
close(done)
|
||||
}()
|
||||
```
|
||||
|
||||
@@ -38,16 +38,16 @@ go func() {
|
||||
|
||||
```go
|
||||
for {
|
||||
select {
|
||||
case <-done:
|
||||
// Drain fileSizes to allow existing goroutines to finish.
|
||||
for range fileSizes {
|
||||
// Do nothing.
|
||||
}
|
||||
return
|
||||
case size, ok := <-fileSizes:
|
||||
// ...
|
||||
}
|
||||
select {
|
||||
case <-done:
|
||||
// Drain fileSizes to allow existing goroutines to finish.
|
||||
for range fileSizes {
|
||||
// Do nothing.
|
||||
}
|
||||
return
|
||||
case size, ok := <-fileSizes:
|
||||
// ...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -55,13 +55,13 @@ walkDir這個goroutine一啟動就會輪詢取消狀態,如果取消狀態被
|
||||
|
||||
```go
|
||||
func walkDir(dir string, n *sync.WaitGroup, fileSizes chan<- int64) {
|
||||
defer n.Done()
|
||||
if cancelled() {
|
||||
return
|
||||
}
|
||||
for _, entry := range dirents(dir) {
|
||||
// ...
|
||||
}
|
||||
defer n.Done()
|
||||
if cancelled() {
|
||||
return
|
||||
}
|
||||
for _, entry := range dirents(dir) {
|
||||
// ...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -71,13 +71,13 @@ func walkDir(dir string, n *sync.WaitGroup, fileSizes chan<- int64) {
|
||||
|
||||
```go
|
||||
func dirents(dir string) []os.FileInfo {
|
||||
select {
|
||||
case sema <- struct{}{}: // acquire token
|
||||
case <-done:
|
||||
return nil // cancelled
|
||||
}
|
||||
defer func() { <-sema }() // release token
|
||||
// ...read directory...
|
||||
select {
|
||||
case sema <- struct{}{}: // acquire token
|
||||
case <-done:
|
||||
return nil // cancelled
|
||||
}
|
||||
defer func() { <-sema }() // release token
|
||||
// ...read directory...
|
||||
}
|
||||
```
|
||||
|
||||
|
Reference in New Issue
Block a user