使用fmt.Fscanf函数从输入中读取格式化的数据
fmt.Fscanf函数是一个非常有用的Go语言函数,它可以从输入中读取格式化的数据,并将其赋值给指定的变量。fmt.Fscanf非常灵活,可以与各种数据类型一起使用,例如:字符串、整数、浮点数等。
如何使用fmt.Fscanf函数
fmt.Fscanf函数接受三个参数:
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
r:输入流,通常是os.Stdin
format:格式化字符串,它定义了要读取的数据类型和它们的顺序。
a:一个或多个指向要读取数据的变量的指针。
fmt.Fscanf函数返回读取的项目数量和可能的错误。如果读取的项目数量小于提供的参数数量,则fmt.Fscanf将返回一个错误。
通过例子了解fmt.Fscanf函数
接下来,我们将结合一个例子来说明如何使用fmt.Fscanf函数。
假设我们有一个输入流,其中包含以下三个项目:
2 3.14 hello
我们想要读取这三个项目,并将它们赋值给一个整型变量、一个浮点型变量和一个字符串变量。我们可以使用以下代码:
package main
import (
"fmt"
"os"
)
func main() {
var i int
var f float64
var s string
_, err := fmt.Fscanf(os.Stdin, "%d %f %s", &i, &f, &s)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("i:", i)
fmt.Println("f:", f)
fmt.Println("s:", s)
}
运行结果为:
i: 2
f: 3.14
s: hello
这个例子中,我们首先定义了一个整型变量、一个浮点型变量和一个字符串变量。然后,我们使用fmt.Fscanf函数从os.Stdin中读取三个项目,分别是一个整数,一个浮点数和一个字符串。我们在调用fmt.Fscanf函数时,前两个参数的类型分别为*int和*float64,这是因为我们想要修改i和f的值。第三个参数的类型为*string,这是因为fmt.Fscanf函数使用指向变量的指针来接收字符串。
使用fmt.Fscanf函数处理复杂数据
fmt.Fscanf函数非常灵活,可以处理各种格式化数据。下面是一个处理复杂数据的示例:
假设有一组数据,其中包含了一个整型数组、一个浮点型数组和一个字符串。我们想要用fmt.Fscanf函数来读取这些数据并将它们保存到一个结构体中。结构体的定义如下:
type MyData struct {
Ints [3]int
Floats [3]float64
Str string
}
我们可以使用以下代码实现这个功能:
package main
import (
"fmt"
"os"
)
type MyData struct {
Ints [3]int
Floats [3]float64
Str string
}
func main() {
var data MyData
_, err := fmt.Fscanf(os.Stdin, "%d %d %d %f %f %f %s",
&data.Ints[0], &data.Ints[1], &data.Ints[2],
&data.Floats[0], &data.Floats[1], &data.Floats[2],
&data.Str)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Ints:", data.Ints)
fmt.Println("Floats:",data.Floats)
fmt.Println("Str:", data.Str)
}
运行结果为:
Ints: [1 2 3]
Floats: [1.1 2.2 3.3]
Str: hello
在这个示例中,我们首先定义了一个MyData结构体,它包含了一个整型数组、一个浮点型数组和一个字符串。然后,我们使用fmt.Fscanf函数从输入流中读取这些数据,并将它们赋值给结构体。注意,我们需要分别为MyData结构体的每个成员提供一个指向变量的指针。
小结
fmt.Fscanf函数是一个非常强大的Go语言函数,它可以将格式化的数据直接读取到变量中。fmt.Fscanf函数非常灵活,可以与各种数据类型一起使用。您可以使用它来读取简单或复杂的格式化数据,并将它们保存到您的结构体或其他数据结构中。