package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
fmt.Print("Enter a grade: ")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
log.Fatal(err)
fmt.Println(input)
}
// console
F:\workspace\Golang>go run failing.go
Enter a grade: 555
2021/03/28 09:43:02 <nil>
exit status 1
复制代码
这段程序报告了一个错误并退出了,即使它成功从键盘读取了输入。
从上面这段程序可以看出,如果 err 变量中的值为 nil,则表示从键盘读取成功。现在我们可以结合 if 语句,仅在 err 不为 nil 时退出程序。
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
fmt.Print("Enter a grade: ")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
log.Fatal(err)
}
fmt.Println(input)
}
// console
F:\workspace\Golang>go run failing.go
Enter a grade: 50
50
复制代码
再看下面一段程序。是一个打印文件大小的 Go 程序。它调用 os.Stat 函数,该函数返回一个 os.FileInfo 值,可能还返回错误值。然后它对 FileInfo 值调用 Size 方法来获取文件大小。
package main
import (
"fmt"
"os"
)
func main() {
fileInfo, _ := os.Stat("my.txt")
fmt.Println(fileInfo.Size())
}
//console
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x38 pc=0x1527af]
goroutine 1 [running]:
main.main()
F:/workspace/Golang/failing.go:10 +0x4f
exit status 2
复制代码
上面这段程序使用_空白标识符来忽略 os.Stat 返回的错误值。如果发生了错误(如果文件不存在就会发生错误),将导致程序失败。
下面我们添加一段代码,如果错误不是 nil,则将其传递给 log.Fatal。
package main
import (
"fmt"
"log"
"os"
)
func main() {
fileInfo, err := os.Stat("my.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println(fileInfo.Size())
}
// console
2021/03/28 23:23:16 CreateFile my.txt: The system cannot find the file specified.
exit status 1
复制代码
评论