golang 中 goroutines 和 channels 的高级用法
在 Golang 的并发编程中,Goroutines 和 Channels 是两个非常重要的概念。Goroutines 是轻量级线程,可以并发执行,而 Channels 则是 Goroutines 之间通信的机制。在这篇文章中,我们将探讨 golang 中 goroutines 和 channels 的高级用法,并通过代码示例来说明。
一、Goroutines 的高级用法
package main
import (
"fmt"
)
func fibonacci(n int, c chan<- int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)
}
func factorial(n int, c chan<- int) {
result := 1
for i := 1; i <= n; i++ {
result *= i
}
c <- result
close(c)
}
func main() {
fibChan := make(chan int)
factChan := make(chan int)
go fibonacci(10, fibChan)
go factorial(5, factChan)
for {
select {
case fib, ok := <-fibChan:
if ok {
fmt.Println("Fibonacci:", fib)
} else {
fibChan = nil
}
case fact, ok := <-factChan:
if ok {
fmt.Println("Factorial:", fact)
} else {
factChan = nil
}
default:
if fibChan == nil && factChan == nil {
return
}
}
}
}package main
import (
"fmt"
"sync"
)
func fibonacci(n int, c chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)
}
func factorial(n int, c chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
result := 1
for i := 1; i <= n; i++ {
result *= i
}
c <- result
close(c)
}
func main() {
fibChan := make(chan int)
factChan := make(chan int)
var wg sync.WaitGroup
wg.Add(2)
go fibonacci(10, fibChan, &wg)
go factorial(5, factChan, &wg)
go func() {
wg.Wait()
close(fibChan)
close(factChan)
}()
for {
select {
case fib, ok := <-fibChan:
if ok {
fmt.Println("Fibonacci:", fib)
} else {
fibChan = nil
}
case fact, ok := <-factChan:
if ok {
fmt.Println("Factorial:", fact)
} else {
factChan = nil
}
default:
if fibChan == nil && factChan == nil {
return
}
}
}
}二、Channels 的高级用法
PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。它可以比 CGI或者Perl更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多。下面介绍了十个PHP高级应用技巧。 1, 使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里
440
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 3)
ch <- 1
ch <- 2
ch <- 3
fmt.Println(<-ch)
fmt.Println(<-ch)
fmt.Println(<-ch)
}package main
import (
"fmt"
"time"
)
func counter(ch chan<- int) {
for i := 1; i <= 5; i++ {
ch <- i
time.Sleep(time.Second)
}
close(ch)
}
func main() {
ch := make(chan int)
go counter(ch)
for val := range ch {
fmt.Println(val)
}
}综上所述,Golang 中的 Goroutines 和 Channels 提供了强大且灵活的并发编程能力。通过选择语句、WaitGroup、缓冲区和 range 关键字等高级用法,我们可以更好地控制 Goroutines 和 Channels 的行为。希望本文所给出的代码示例能够帮助读者更好地理解和应用这些高级用法。
立即学习“go语言免费学习笔记(深入)”;
以上就是Golang 中 Goroutines 和 Channels 的高级用法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号