Go 如何匹配开关中的字符串

Go 如何匹配开关中的字符串,go,Go,我正在将一个字节片转换为一个字符串,并试图在一个开关的情况下捕获它。(不确定如何捕获字节片,因此无法转换) 我不知道如何让我的switch语句工作 我错过了什么 package main import "os/exec" func main() { // Query existing layout cmd, _ := exec.Command("setxkbmap", "-query").Output() // Retrieve the language, can

我正在将一个字节片转换为一个字符串,并试图在一个开关的情况下捕获它。(不确定如何捕获字节片,因此无法转换)

我不知道如何让我的switch语句工作

我错过了什么

package main

import "os/exec"

func main() {

    // Query existing layout
    cmd, _ := exec.Command("setxkbmap", "-query").Output()

    // Retrieve the language, cant figure out a better way
    lang   := string(cmd[len(cmd)-3:])

    // Switch to the other language
    var newLang string

   print(lang) // prints gb

    switch lang {
      case "se": newLang = "gb"
      case "gb": newLang = "se"
    }

    print(newLang) // prints nothing

    // set new layout
    exec.Command("setxkbmap", "-layout", newLang)
}

鉴于
setxkbmap-query
的输出可以有多行,并且您要查找的值(我假设是
layout
)不一定总是最后一个打印的值,我建议读取输出的每一行,检查
layout:
字段,然后分配值

例如:

out, err := exec.Command("setxkbmap", "-query").Output()
if err != nil {
    return err
}
var layout string
s := bufio.NewScanner(bytes.NewReader(out))
for s.Scan() {
    fields := strings.Fields(s.Text())
    if len(fields) != 2 {
        continue
    }
    if fields[0] == "layout:" {
        layout = fields[1]
        break
    }
}
switch layout {
case "gb":
    // handle gb layout
    fmt.Println("got gb layout")
    return nil
default:
    return fmt.Errorf("unexpected layout: %q", layout)
}

这里到底有什么不起作用?你看不到的新行问题?很好用。(请记住,print不是println)然后尝试
fmt.Printf(“%q\n”,lang)
查看被引号包围的整个字符串,那里可能有空格,而在
print
中看不到。字节转换肯定不是问题。这是另外一回事。正如volker和mkopriva所建议的,检查字节片中是否有空格或其他不可见字符。