输入正确但在 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))
您需要将当前为 []byte
的 bs
转换为 string
并且您需要添加 %s
以指示 fmt.Printf
其中 string(bs)
应该放在格式 string
中
您使用 =
而不是 :=
所以这里是你的错误来源。
尝试写一些 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))
您需要将当前为 []byte
的 bs
转换为 string
并且您需要添加 %s
以指示 fmt.Printf
其中 string(bs)
应该放在格式 string
您使用 =
而不是 :=
所以这里是你的错误来源。