我正在实现一个使用bufio.Scanner和bufio.Writer的go程序,我将代码打包如下
package main
import (
"fmt"
"player/command"
"strings"
)
func main() {
//Enter your code here. Read input from STDIN. Print output to STDOUT
for commands.Scanner.Scan() {
//scan a new line and send it to comand variable to check command exist or not
input := strings.Split(strings.Trim(commands.Scanner.Text(), " "), " ")
command := input[0]
if command == "" {
fmt.Printf("$ %s:", commands.Pwd)
continue
}
if !commands.Commands[command] {
commands.ThrowError("CANNOT RECOGNIZE INPUT.")
} else {
commands.Execute(command, input[1:], nil)
}
fmt.Printf("$ %s:", commands.Pwd)
}
}
我也在主包中使用init.go文件,如下所示
package main
import (
"flag"
"player/source"
)
func init() {
sourceFlag := flag.String("filename", "", "if input is through source file")
flag.Parse()
if *sourceFlag != "" {
source.Input(*sourceFlag)
}
}
我的最终包裹播放器/来源如下: -
package source
import (
"bufio"
"log"
"os"
"player/command"
)
func Input(source string) {
if source != "" {
readFile, err := os.OpenFile(source, os.O_RDONLY, os.ModeExclusive)
if err != nil {
log.Fatal(err)
}
commands.Scanner = bufio.NewScanner(readFile)
writeFile, err := os.Create(source + "_output.txt")
if err != nil {
log.Fatal(err)
}
commands.Writer = bufio.NewWriter(writeFile)
} else {
commands.Scanner = bufio.NewScanner(os.Stdin)
commands.Writer = bufio.NewWriter(os.Stdout)
// fmt.Println(commands.Scanner)
}
}
执行此代码会导致
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x58 pc=0x4a253a]
goroutine 1 [running]:
bufio.(*Scanner).Scan(0x0, 0x5)
/usr/local/go/src/bufio/scan.go:120 +0x2a
main.main()
/home/xyz/dev/go/src/players/main.go:13 +0x124
即使在我的扫描仪初始化之后,我也不知道原因为什么我无法从中读取
答案 0 :(得分:2)
command.Scanner
未初始化的一个原因可能是您没有将filename
参数传递给主脚本。在这种情况下,永远不会调用source.Input(*sourceFlag)
,因为if条件(如果缺少if *sourceFlag != ""
选项,filename
为false)。
此外,由于您要在source
中检查空文件名,main
的{{1}}中的这种情况是多余的。尝试:
init