登录
首页 >  Golang >  Go问答

Go代码无法成功在后台运行

来源:stackoverflow

时间:2024-03-22 09:27:51 485浏览 收藏

在编写 Go 程序时,用户遇到了一个问题,即该程序在后台运行时无法从键盘获取输入,导致无法触发预期的音频播放。此外,程序中使用了变量 n 来索引声音文件,但其值取决于用户输入,这可能导致索引超出范围错误。

问题内容

go代码在后台运行

我是go语言的初学者。 我写了一个小程序,让键盘发出声音。 go build main.go 后,可以在当前 shell 中听到按钮的声音。 但在后台运行 ./main 或重新打开新 shell 时将听不到按钮声音。 这就是我需要帮助的地方。

package main

import (
    "fmt"
    "github.com/eiannone/keyboard"
    "github.com/faiface/beep"
    "github.com/faiface/beep/speaker"
    "github.com/faiface/beep/wav"
    "os"
    "time"
    "log"
    "path/filepath"

)

func main(){

    env:= os.Getenv("HOME")
    fmt.Println(env)

    err := keyboard.Open()
    if err != nil {

        panic(err)
    }
    defer keyboard.Close()
    for {
        char, key, err := keyboard.GetKey()
        if err != nil {
            log.Fatal(err)
        }else if (key == keyboard.KeyEsc){
            break
        }

        n := int(char)
        path := "./wav/*.wav"
        fpath,_ := filepath.Glob(path)
        name := fpath[n]

        f, err := os.Open(name)
        if err != nil {
            log.Fatal(err)
        }

        streamer, format, err := wav.Decode(f)
        if err != nil {
            log.Fatal(err)
        }
        defer streamer.Close()

        speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))

        done := make(chan bool)
        speaker.Play(beep.Seq(streamer, beep.Callback(func() {
            done <- true
        })))

        <-done

    }

}

我希望它在后台运行。按下键盘后可以听到相应的声音。


解决方案


如果程序在后台运行,它将不会从键盘获取任何输入。

此外,由于 n 取决于用户输入,因此它很容易超出声音文件的数量,并且您会在运行时收到索引越界错误。你应该做这样的事情:

if fpath, _ := filepath.Glob("./wav/*.wav"); len(fpath) > 0 {
        n := int(char)%len(fpath)
           name := fpath[n]
        ...

今天关于《Go代码无法成功在后台运行》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>