当 switch case 出现错误时如何让 switch 语句起作用

Rah*_*rma 1 go switch-statement

根据命令行中的用户输入,switch case 返回整数的评级。由于命令行参数是字符串类型,我首先将其转换为字符串int,然后在 switch 中使用它。

package main

import (
  "fmt"
  "os"
  "reflect"
  "strconv"
)

func main() {
 rating, _ := strconv.Atoi(os.Args[1])
 fmt.Println(reflect.TypeOf(rating))
 switch rating {
  case rating >= 2100:
    fmt.Println("grand master")
  case rating >= 1900:
    fmt.Println("candidate master")
  case rating >= 1600:
    fmt.Println("expert")
  case rating >= 1400:
    fmt.Println("pupil")
  case rating < 1400:
    fmt.Println("newbie")
  }

}
Run Code Online (Sandbox Code Playgroud)

现在,对于所有比较而言,评级 >= 2100 时都会出现错误。其过程如下:

cannot convert rating >= 2100 (untyped bool value) to intcompilerInvalidUntypedConversion
Run Code Online (Sandbox Code Playgroud)

无法理解如何解决这个问题。

请帮忙!

icz*_*cza 8

如果使用switch表达式,则必须使用case具有可比较性的表达式。规格: Switch 语句:

对于每个(可能已转换的)case 表达式和switch 表达式的x值,必须是有效的比较tx == t

也就是说,如果您使用switch rating { ... },那么您只需要指定整数值,例如2100,而不是像 那样的比较rating >= 2100

显然您不需要单个值而是范围,因此省略 switch 表达式:

switch {
case rating >= 2100:
    fmt.Println("grand master")
case rating >= 1900:
    fmt.Println("candidate master")
case rating >= 1600:
    fmt.Println("expert")
case rating >= 1400:
    fmt.Println("pupil")
case rating < 1400:
    fmt.Println("newbie")
}
Run Code Online (Sandbox Code Playgroud)