【问题标题】:What is wrong with this go switch statement?这个 go switch 语句有什么问题?
【发布时间】:2021-02-09 20:19:34
【问题描述】:

谁能明白为什么这个开关不起作用?

func main() {

    reader := bufio.NewReader(os.Stdin)
    text, _ := reader.ReadString('\n')

    fmt.Print(text)

    switch text {
    case "a":
        fmt.Print("A\n")
    case "b":
        fmt.Print("B\n")
    case "c":
        fmt.Print("C\n")
    default:
        fmt.Print("DEFAULT\n")
    }
}   

在此语句中,始终返回默认值,但在硬编码 switch 表达式时,switch 块可以正常工作。查看 ReadString() func 代码,它返回一个字符串,所以我看不出我的示例无法正常工作的任何原因。

我是不是做错了什么?!

【问题讨论】:

    标签: go


    【解决方案1】:

    根据docs

    ReadString 读取直到输入中第一次出现 delim,返回一个字符串,其中包含最多 的数据并包括 分隔符。

    因此,您可以执行以下操作:

    reader := bufio.NewReader(os.Stdin)
    delim := byte('\n')
    text, _ := reader.ReadString(delim)
    
    switch text = strings.TrimRight(text, string(delim)); text {
      // ...
    }
    

    【讨论】:

    • @donpisci 很高兴它有帮助:-)
    【解决方案2】:

    text 包含“\n”,您需要匹配或修剪。

    switch text = strings.TrimSpace(text); text {
    case "a":
        fmt.Println("A")
    case "b":
        fmt.Println("B")
    case "c":
        fmt.Println("C")
    default:
        fmt.Println("DEFAULT: " + text)
    }
    

    【讨论】:

      【解决方案3】:

      您的文本由两个字节组成:fmt.Print(len(text)) 是 2,fmt.Print(len("a")) 是一。

      您的第二个符号是不可见的,您可以尝试使用text = strings.TrimSpace(text) 将其删除。

      【讨论】:

      • @donpisci 这是很难发现的。
      【解决方案4】:

      因为 \n 文本有空格。您必须通过 strings.Trimspace() 方法将其删除。

      主包

      import (
          "bufio"
          "fmt"
          "os"
          "strings"
      )
      
      func main() {
      
          reader := bufio.NewReader(os.Stdin)
          text, _ := reader.ReadString('\n')
          fmt.Print(text)
          
          switch strings.TrimSpace(text) {
          case "a":
              fmt.Print("A\n")
          case "b":
              fmt.Print("B\n")
          case "c":
              fmt.Print("C\n")
          default:
              fmt.Print("DEFAULT\n")
          }
      }  
      

      【讨论】:

        猜你喜欢
        • 2013-07-07
        • 1970-01-01
        • 2011-04-08
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多