Skip to content

Commit 59d1f6a

Browse files
committed
Add Go Concurrency tutorial source code
1 parent 63121cf commit 59d1f6a

File tree

5 files changed

+140
-0
lines changed

5 files changed

+140
-0
lines changed

go/02-go-concurrency/01-goroutine.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"time"
6+
)
7+
8+
func main() {
9+
go count("sheep")
10+
count("fish")
11+
}
12+
13+
func count(thing string) {
14+
for i := 1; true; i++ {
15+
fmt.Println(i, thing)
16+
time.Sleep(time.Millisecond * 500)
17+
}
18+
}

go/02-go-concurrency/02-wait-group.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"sync"
6+
"time"
7+
)
8+
9+
func main() {
10+
var wg sync.WaitGroup
11+
wg.Add(1)
12+
13+
go func() {
14+
count("sheep")
15+
wg.Done()
16+
}()
17+
18+
wg.Wait()
19+
}
20+
21+
func count(thing string) {
22+
for i := 1; i <= 5; i++ {
23+
fmt.Println(i, thing)
24+
time.Sleep(time.Millisecond * 500)
25+
}
26+
}

go/02-go-concurrency/03-channels.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"time"
6+
)
7+
8+
func main() {
9+
c := make(chan string, 50)
10+
go count("sheep", c)
11+
12+
for msg := range c {
13+
fmt.Println(msg)
14+
}
15+
}
16+
17+
func count(thing string, c chan string) {
18+
for i := 1; i <= 5; i++ {
19+
c <- thing
20+
time.Sleep(time.Millisecond * 500)
21+
}
22+
23+
close(c)
24+
}

go/02-go-concurrency/04-select.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"time"
6+
)
7+
8+
func main() {
9+
c1 := make(chan string)
10+
c2 := make(chan string)
11+
12+
go func() {
13+
for {
14+
time.Sleep(time.Millisecond * 500)
15+
c1 <- "Every 500ms"
16+
}
17+
}()
18+
19+
go func() {
20+
for {
21+
time.Sleep(time.Second * 2)
22+
c2 <- "Every two seconds"
23+
}
24+
}()
25+
26+
for {
27+
select {
28+
case msg1 := <-c1:
29+
fmt.Println(msg1)
30+
case msg2 := <-c2:
31+
fmt.Println(msg2)
32+
}
33+
}
34+
}

go/02-go-concurrency/05-fib.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
func main() {
8+
jobs := make(chan int, 100)
9+
results := make(chan int, 100)
10+
11+
go worker(jobs, results)
12+
go worker(jobs, results)
13+
go worker(jobs, results)
14+
go worker(jobs, results)
15+
16+
for i := 0; i < 100; i++ {
17+
jobs <- i
18+
}
19+
close(jobs)
20+
21+
for j := 0; j < 100; j++ {
22+
fmt.Println(<-results)
23+
}
24+
}
25+
26+
func worker(jobs <-chan int, results chan<- int) {
27+
for n := range jobs {
28+
results <- fib(n)
29+
}
30+
}
31+
32+
func fib(n int) int {
33+
if n <= 1 {
34+
return n
35+
}
36+
37+
return fib(n-1) + fib(n-2)
38+
}

0 commit comments

Comments
 (0)