Как сопоставить строку в переключателе - PullRequest
0 голосов
/ 17 января 2019

Я конвертирую кусочек байта в строку и пытаюсь поймать это в случае переключения. (Не уверен, как ловить байтовые фрагменты, поэтому преобразование).

Я не могу понять, как заставить мой оператор 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)
}

1 Ответ

0 голосов
/ 18 января 2019

Учитывая, что выходные данные 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...