【问题标题】:how to use a `switch` statement in Go如何在 Go 中使用 `switch` 语句
【发布时间】:2022-01-23 01:39:47
【问题描述】:
package main

import "fmt"

func main() {

    var age int
    fmt.Scanf("%d", &age)

    // Code your switch or if...else-if statement here.
    
    switch age {
    case 1:
        age <= 14
        fmt.Println("Toy Story 4")
    case 2:
        age <= 18
        fmt.Println("The Matrix")
    case 3:
        age <= 25
        fmt.Println("John Wick")
    case 4:
        age <= 35
        fmt.Println("Constantine")
    case 5:
        age > 35
        fmt.Println("Speed")
    default:
        fmt.Println("Error: Unknown age")
    }
}

我在 IDE 中看到 scanf 的黄色标记,表示未处理的错误。此外,所有案例的第一行都标记为红色,以防止编译。我得到的错误是age &lt;= 14 is evaluated, but not used。所有的陈述都是如此。我在网上搜索并查看了示例,据我所知,代码是,如材料和示例所述。这是 Go Land (JetBrains) 的屏幕截图:

有人有想法吗?另外,如果您回答,请记住,这是 Go 课程的一课,我必须使用 scanf。我可以将开关更改为 else if,这可能会解决问题,但我有点好奇,为什么会发生这种情况以及如何解决它。 :)

【问题讨论】:

  • 欢迎您!请确保您参加了这次旅行 (go.dev/doc/tutorial/getting-started)。
  • 您可能想查看Switch Statements(或Effective Go)以及基本语法。比较需要在 case 表达式中。
  • 当我们这样做的时候,please do not post screenshots of text。您想向我们展示的所有相关文本都可以作为文本复制并粘贴到问题的文本中。
  • 是的,我们讨厌在 SO 将文本作为屏幕截图。没有他们,你的问题是清楚而完整的。与其将编辑器屏幕截图带入其中,您将来可能会使用 Go Playrgound 来分享行为(go.dev/play),但就像我说的那样,这个问题写得很好,没有屏幕截图
  • 感谢所有这些 cmets!我对截图感到抱歉,并将对其进行编辑。至于问题:我是 JetBrains Academy 的测试员,这是一个新话题。由于我关注 Go 有一段时间了,所以我同意测试它,然后从那里开始。问题在于他们的理论。他们的代码说明是错误的。所以这就是为什么我无法弄清楚。 :) 感谢收获。

标签: go switch-statement conditional-statements


【解决方案1】:

补充一下 Daniel 写的内容——基本上 switch 语句(除非它是一个类型 switch,但我们不要离题)有两种形式:

switch { // note the absense of any expression here
  case bool_expr_1:
    ...
  case bool_expr_2:
    ...

switch any_expr {
  case value_to_match_1:
    ...
  case value_to_match_2:
    ...

在第一种形式中,每个case 分支中的表达式从上到下进行计算,第一个计算结果为true,“wins”,即执行该分支中的代码。
在第二种形式中,对表达式求值以产生一个值,然后将其与每个 case 分支中的值进行精确比较。

您已尝试将这两种形式组合在一起,但这是行不通的。
您可能认为 case 分支中的这些数字是应该如何检查分支的顺序,但不,不是这样。

【讨论】:

  • 您好,感谢您的详细解释。实际上,我对案件中的数字有一个头脑放屁。这没有意义,因为用户不应该输入一个数字,而是一个年龄,然后要检查它。但是即使撇开这个事实,类的理论也是错误的,在这种情况下 switch 语句不应该有表达式。它需要修改和更改以处理这两种情况,并明确何时使用哪一种。我也猜想,在我的脑海里,我有点想到了 Java。 :)
【解决方案2】:

age &lt;= 14 不是一个有效的 Go 表达式,尽管它可以用作其中的一部分。 Go 对所有被消耗的值都非常讲究。

这不是用&lt;= 运算符编写case 的正确方法。

    switch age {
    case 1:
        age <= 14
        fmt.Println("Toy Story 4")
    ...
    }

如果age 的值为1,则该情况匹配。您想使用这样的开关样式:

switch {
case age <= 14:
   fmt.Println("Toy Story 4")
case age <= 18:
   ...
...
}

【讨论】:

  • 谢谢!这确实奏效了。我正在为 JetBrains Academy 测试这个付费 Go 课程。我关注 Go 已经有一段时间了,所以这是一个很好的机会。问题在于他们的理论,这给我带来了麻烦。我不能在这里发表评论,它看起来很奇怪,但它基本上就是我所做的。它要求 switch 变量 case: 然后在要运行的代码下方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
相关资源
最近更新 更多