求教一段 Golang Go语言中的代码
package main
import “fmt”
func fibonacci(c, quit chan int) {
x, y := 1, 1
for {
select { //走到这里会阻塞等待
case c <- x: //有数据传入通道 才会来 不是吗??
x, y = y, x+y
case <-quit:
fmt.Println(“quit”)
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c) //阻塞 直到有数据可以取才执行
}
quit <- 0
}()
fibonacci(c, quit)
}
通篇没有看到 向通道里传递值呀···· 怎么会走到 select 下的 case c <- x: 中去呢??
求教一段 Golang Go语言中的代码
更多关于求教一段 Golang Go语言中的代码的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
c <- x 就是向 c 里传递值,那个 select 选择的是:要么 c 可写入,要么 quit 可读出。
更多关于求教一段 Golang Go语言中的代码的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 1, 1
for {
select { //走到这里会阻塞等待
case c <- x: //① 这里把 x 传入通道 c,传入之后,②处立刻可以输出
x, y = y, x+y
case <-quit:
fmt.Println(“quit”)
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c) //② 阻塞 直到有数据可以取才执行 ①处把 x 传入通道 c,这里立刻可以输出
}
quit <- 0
}()
fibonacci(c, quit)
}
c,quit 都是 chan 的话,我一个没学过 go 的人都知道这操作明显是不同的
case c <- x 这是向 c 传值,只要 c 是可写的就会走到这里
= =b 哦 好像明白了 那 select 的执行时随机的 保不齐走到 <- quit 发现 为 false ?
不好意思 没说明白 我又整理了下思路 是不是这样
② 阻塞 阻塞了 新开的 goroutine
fibonacci 里的 select 阻塞了 原来的 goroutine
然后发现两个 goroutine 都准备好了
随机执行了 case 语句 case <-quit: 执行返回 false ? 因为通道里没有数据? case c <- x: 返回了 true
sorry select 监听到了 channel c 中有接收 所以会运行
#6
select 中 case 的发生是随机的,但是得有东西在 quit 中才可以执行到<- quit 啊。
chan 操作里面 chan <-是塞东西进 chan,没有缓冲或塞满会阻塞。
<- chan 操作是取出东西, 如果没东西出来的话会阻塞。
在 select 里面, 会随机执行一个非阻塞的 case
正解
当然,我很乐意帮你提供一些关于Go语言的代码示例。这里有一个简单的例子,演示了如何在Go语言中实现一个基本的HTTP服务器,它会对所有的GET请求返回“Hello, World!”:
package main
import (
"fmt"
"log"
"net/http"
)
// handler 函数处理传入的HTTP请求
func handler(w http.ResponseWriter, r *http.Request) {
// 检查请求方法是否为GET
if r.Method != http.MethodGet {
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
return
}
// 向客户端写入响应
fmt.Fprint(w, "Hello, World!")
}
func main() {
// 将"/"路径的请求与handler函数关联
http.HandleFunc("/", handler)
// 在8080端口启动HTTP服务器
port := ":8080"
fmt.Printf("Starting server at port %s\n", port)
if err := http.ListenAndServe(port, nil); err != nil {
log.Fatalf("Could not listen on port %s: %v\n", port, err)
}
}
这个代码片段定义了一个简单的HTTP服务器,它会监听8080端口。当接收到GET请求时,服务器会响应“Hello, World!”。你可以将这个代码保存到一个.go
文件中,然后使用go run
命令运行它。之后,你可以在浏览器中访问http://localhost:8080
来查看结果。
如果你有更具体的问题或需要更复杂的示例,请随时告诉我!