求教一段 Golang Go语言中的代码

发布于 1周前 作者 bupafengyu 来自 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

10 回复

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来查看结果。

如果你有更具体的问题或需要更复杂的示例,请随时告诉我!

回到顶部