I am implementing a go program which uses bufio.Scanner and bufio.Writer i have packaged my code as follows
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)
}
}
I am also using init.go file in main package as follows
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)
}
}
and my final package player/source is as follows :-
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)
}
}
Execution of this code results in
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
I dont know the reason even after initializing my scanner why i am not been able to read from it