当前位置: 首页 > 面试题库 >

去教程选择语句

范侯林
2023-03-14
问题内容

我正在浏览tour.golang.org中的示例,并且遇到了我不太了解的这段代码:

package main
import "fmt"

func fibonacci(c, quit chan int) {
    x, y := 0, 1
    for {
        select {
        case c <- x: // case: send x to channel c?
            x, y = y, x+y
        case <-quit: // case: receive from channel quit?
            fmt.Println("quit")
            return
        }
    }
}

func main() {
    c := make(chan int)
    quit := make(chan int)
    go func() { // when does this get called?
        for i := 0; i < 10; i++ {
            fmt.Println(<-c)
        }
        quit <- 0
    }()
    fibonacci(c, quit)
}

我了解通道工作的基础知识,但是我没有得到的是上述select语句的工作方式。教程中的说明说:


select语句使goroutine等待多个通信操作。一个select阻塞直到它的一种情况可以运行,然后它执行该情况。如果有多个就绪,它将随机选择一个。”

但是案件如何执行?据我所知,他们在说:

案例:发送x到频道c

案例:收到戒烟

我想我知道第二个命令只有在quit有一个值时才执行,稍后在go func()内部完成。但是第一种情况要检查什么?另外,在go
func()内部,显然是从c打印值,但是c在那时候不应该包含任何内容?我能想到的唯一解释是go
func()在调用fibonacci()之后以某种方式执行。我猜这是一个我也不完全了解的goroutine,就像魔术一样。

如果有人可以通过这段代码告诉我它在做什么,我将不胜感激。


问题答案:

请记住,通道会阻塞,因此select语句为:

select {
case c <- x: // if I can send to c
    // update my variables
    x, y = y, x+y
case <-quit: // If I can receive from quit then I'm supposed to exit
    fmt.Println("quit")
    return
}

没有default案例意味着“如果我无法发送给c并且我不能从quit中读取,请阻塞直到可以。”

然后在您的主要过程中,您将剥离另一个函数以读取c结果以打印结果

for i:=0; i<10; i++ {
    fmt.Println(<-c)  // read in from c
}
quit <- 0  // send to quit to kill the main process.

这里的关键是要记住通道阻塞,并且您正在使用两个未缓冲的通道。利用go分拆的第二功能让您从消费c那么fibonacci将继续。

Goroutines是所谓的“绿色线程”。使用关键字启动函数调用go会将其分解为一个新进程,该进程独立于执行主线运行。本质上,main()go func() ...正在同时运行!这很重要,因为我们在此代码中使用了生产者/消费者模式。

fibonacci产生值并将其发送到c,从main派生的匿名goroutine会消耗c并处理它们的值(在这种情况下,“处理它们”仅意味着打印到屏幕上)。我们不能简单地产生所有值然后消费它们,因为c会阻塞。此外,fibonacci它将永远产生更多的值(或无论如何直到整数溢出),因此即使您拥有一个具有无限长缓冲区的魔术通道,也永远不会到达使用者。



 类似资料:
  • 喜欢程序员这份工作的独立的程序员可以为任务选择最好的语言。大多数职业程序员控制不了他们将要使用的语言。通常,这个话题会由执行行政决议而非技术决议的boss说出,他们缺少勇气去提升新型工具,即使他们知道,大多数时候使用最新的知识,最少被接受的工具是最好的。另一些情况下,这种团体中真实的好处,以及拓展一个更大的社区的好处,排除了个人的选择。通常管理者由能够雇用在给定的语言有些经验的程序员驱动。毫无疑问

  • 本文向大家介绍jQuery选择器基础入门教程,包括了jQuery选择器基础入门教程的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery选择器用法。分享给大家供大家参考,具体如下: 什么是jQuery选择器 使用JavaScript操作页面上得DOM元素时,首先要获取DOM元素。但是原始的javascript只元件根据ID或者TagName获取DOM对象。 在jQuery中则完全不同

  • 如何选择shell编程语言 熟悉 vs 陌生 如果你已经掌握了一门编程语言(如PHP、Python、Java、JavaScript),建议你就直接使用这门语言编写脚本程序,虽然某些地方会有点啰嗦,但你能利用在这门语言领域里的经验(单元测试、单步调试、IDE、第三方类库)。 新增的学习成本很小,只要学会怎么使用shell解释器(Jshell、AdaScript)就可以了。 简单 vs 高级 如果你觉

  • 问题内容: 我在C#项目中将SQLServer用于故障排除程序,并且我有一个包含ID,Question,QuestionId,Solution和Rank的表。我希望有一个问题的多个解决方案,并且程序将选择排名最高的解决方案,该解决方案仅由最高的数字来选择,该数字在每次正确时都会递增。为此,我有以下SQL语句: 当我只有一个可用的解决方案时,它可以很好地工作,但是当我有多个解决方案时,它却不能。 问

  • 问题内容: 刚尝试去最近。我想知道如果您有一条select语句等待在几个通道上进行通信,并且如果消息同时在两个或多个通道上出现,将会发生什么情况。如果所有消息都同时发出,那么select将如何确定接受哪个通道? 谢谢! 问题答案: 从规格: 如果可能发生多种情况,则将做出统一的伪随机选择,以决定执行哪个单一通信。 因此,选择是不确定的。

  • 本文向大家介绍jQuery中选择器的基础使用教程,包括了jQuery中选择器的基础使用教程的使用技巧和注意事项,需要的朋友参考一下 其实选择器就像开罐器一样,会用这个工具的人,自然吃的到甜头,但不会用这个工具的人,不管罐头里面的面筋土豆有多美味,吃不到就是吃不到,就如同jquery再怎么强大,也只能看着荧幕,而不知该如何下手,不过虽然选择器不难,也容易上手,但老实说,我用了一年多下来,还是觉得自己