如何在 Go 中使用 `switch` 语句

how to use a `switch` statement in Go

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")
    }
}

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

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

age <= 14 不是一个有效的 Go 表达式,尽管它可以用作一个表达式的一部分。 Go 非常讲究所有被消费的值。

这不是使用 <= 运算符编写 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:
   ...
...
}

补充一下 Daniel 所写的 — 基本上 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,“获胜”——也就是说,其中的代码分支被执行。
在第二种形式中,对表达式求值以产生一个值,然后将该值与每个 case 分支中的值进行精确比较。

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