输入正确但在 golang 中输出恐慌

Correct on input but panic on output in golang

尝试写一些 go,我想在 Golang 中创建一种 cat 函数:

package main

import (
        "fmt"
        "os"
        "io/ioutil"
        "log"
)

func main() {
        // part to ask the question and get the input
        fmt.Print("Which file would you like to read?: ")
        var input string
        fmt.Scanln(&input)
        fmt.Print(input)

        // part to give the output
        f, err := os.Open(os.Args[1]) // Open the file                                       
        if err != nil {
                log.Fatalln("my program broken")
        }

        defer f.Close() // Always close things open                                          

        bs, err := ioutil.ReadAll(f)
        if err != nil {
                log.Fatalln("my program broken")
        }

        // part to print the output
        fmt.Printf("input", bs) // %s convert directly in string the result                  

}

但是我在执行时感到恐慌,没有找到更明确的信息。

我做错了什么?

如何从终端获取有关该错误的更多信息?

$ go run gocat.go Which file would you like to read?: gocat.go gocat.gopanic: runtime error: index out of range

goroutine 1 [running]: panic(0x4b1840, 0xc42000a0e0) /usr/lib/go/src/runtime/panic.go:500 +0x1a1 main.main() /home/user/git/go-experimentations/gocat/gocat.go:23 +0x4ba exit status 2

不是os.Open(os.Args[1])Args[1]超出范围。你应该像这样打开你输入的文件:

f, err := os.Open(input)

我想你在网上找到了一些例子,但不太明白这是怎么回事。

来自 os 包的文档。

Args hold the command-line arguments, starting with the program name.

由于您在没有任何参数的情况下启动程序并且 os.Args 是一个切片,因此当您访问切片的边界时程序会出现混乱。 (就像试图访问任何不存在的数组的元素一样)

您似乎是想在此处提示输入

var input string
fmt.Scanln(&input)
fmt.Print(input)

您只需更换

f, err := os.Open(os.Args[1])

有:

f, err := os.Open(input)

你最后的打印语句也不正确。

应该是:

// part to print the output
fmt.Printf("input \n %s", string(bs))

您需要将当前为 []bytebs 转换为 string 并且您需要添加 %s 以指示 fmt.Printf 其中 string(bs) 应该放在格式 string

您使用 = 而不是 := 所以这里是你的错误来源。