gpt4 book ai didi

go - 是否可以将 `fmt.Fscan` 或 `fmt.Scan` 用于标准 I/O?

转载 作者:IT王子 更新时间:2023-10-29 02:26:14 26 4
gpt4 key购买 nike

关于Golang中的标准I\O,网上所有的教程,无一异常(exception)地讨论和使用bufio,我测试过,效果很好。

但我的问题是关于使用 fmt 包读取标准输入,这要么给我错误,要么陷入循环。根据 fmt.Scan 文档:

Scan scans text read from standard input, storing successive space-separated values into successive arguments. Newlines count as space. It returns the number of items successfully scanned. If that is less than the number of arguments, err will report why.

第一句说Scan是从标准输入读取,但是根本不起作用!也适用于具有此签名的 fmt.Fscan:

func Fscan(r io.Reader, a ...interface{}) (n int, err 错误)

当我输入一个单词时,它会抛出异常,我什至无法理解它们!

那么,是否可以使用这2种方法来读取标准输入呢?


有关更多信息,这是我的代码:

package main

import (
"fmt"
"os"
)

func main() {

fmt.Print("pls enter name: ")

var st *string

n, err := fmt.Fscan(os.Stdin, st)

fmt.Println(st)

fmt.Println(n)
fmt.Println(err)

编辑:在上面的代码中输入单词时出现的错误:

panic: runtime error: invalid memory address or nil pointer dereference [recover
ed]
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x1 addr=0x8 pc=0x4977aa]

goroutine 1 [running]:
fmt.errorHandler(0xc04206be40)
C:/development/Programming Languages/GO/src/fmt/scan.go:1031 +0x14f
panic(0x4b15a0, 0x544720)
C:/development/Programming Languages/GO/src/runtime/panic.go:505 +0x237
fmt.(*ss).scanOne(0xc042044060, 0x76, 0x4a6460, 0x0)
C:/development/Programming Languages/GO/src/fmt/scan.go:979 +0xc7a
fmt.(*ss).doScan(0xc042044060, 0xc04206bf48, 0x1, 0x1, 0x0, 0x0, 0x0)
C:/development/Programming Languages/GO/src/fmt/scan.go:1040 +0x9d
fmt.Fscan(0x4de080, 0xc042004010, 0xc04206bf48, 0x1, 0x1, 0x0, 0x10, 0x4b36c0)
C:/development/Programming Languages/GO/src/fmt/scan.go:123 +0xd2
main.main()
C:/Users/Hamed/Documents/Go Projects/src/golang/learning/helloworld/firs
tApp.go:22 +0xe3

最佳答案

我注意到您的代码的第一件事是您将 nil 指针传递给 fmt.Fscan,即您声明了变量 st as *string 但地址尚不存在。应该写成:

var st string
_, err := fmt.Fscan(os.Stdin, &st)
if err != nil {
fmt.Println(err)
}

在我修改后的例子中,st 现在有一个内存地址(string 的零值是 ""),所以它是地址可以使用&获取,然后传递给fmt.Fscan。其次,您应该注意我如何处理从 fmt.Fscan 返回的 err - 您只需打印 err,但如果 err 没有返回?然后 errnil 并且您的 fmt.Println(err) 无故执行 - 处理返回的 error< 是惯用的s 是有条件的,就像在上面的例子中所做的那样。

然而,使用 fmt.Scanf 更为常见像这样:

var st string
fmt.Scanf("%s", &st)

阅读文档了解更多信息。 The "fmt" package .

关于go - 是否可以将 `fmt.Fscan` 或 `fmt.Scan` 用于标准 I/O?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49517408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com