gpt4 book ai didi

go - 为什么我使用 fmt.Fscanf 时得到 "input does not match format"?

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

我正在尝试使用 fmt.Fscanf 但我很难弄清楚如何使用。具有以下代码:

package main

import (
"fmt"
"strings"
)

func main() {
var host, user, date, httpStr string
var code, size int

r := strings.NewReader(`127.0.0.1 - james [09/May/2018:16:00:39 +0000] "GET /report HTTP/1.0" 200 123`)

_, err := fmt.Fscanf(r, `%s - %s [%s], "%s" %d %d`,
&host, &user, &date, &httpStr, &code, &size)
if err != nil {
fmt.Printf("Failed to parse log line, error: %+v\n", err)
panic(err)
}

fmt.Println(host, user, date, httpStr, code, size)

}

去 Playground :https://play.golang.org/p/zGxc6MXOF3a

我得到:

Failed to parse log line, error: input does not match format
panic: input does not match format

goroutine 1 [running]:
main.main()
.../fscanf/main.go:19 +0x57b
exit status 2

为什么?

最佳答案

错误来自于Fscanf解析 空格分隔的 字符串。这在读取日期和 HTTP 字符串时成为一个问题:

当它读取日期时,它不会读取 09/May/2018:16:00:39 +0000,而是读取到第一个空格:09/May/2018:16 :00:39 然后期待 ]

要解决这个问题,将字符串解析为 [%s %s] 是有意义的,但这会更巧妙地失败。它会将时区解析为 +0000] 因为它在第一个空格处停止,而不是根据格式字符串。 HTTP 字符串也会出现同样的问题:它在动词 GET 之后停止解析,然后在路由 /report 之后停止解析,但是在读取协议(protocol)时它会读取 HTTP/1.0" 不是 HTTP/1.0

一个有效的解决方案如下:

package main

import (
"fmt"
"log"
"strings"
)

func main() {
var host, user, date, tzOffset, verb, route, proto string
var code, size int

r := strings.NewReader(`127.0.0.1 - james [09/May/2018:16:00:39 +0000] "GET /report HTTP/1.0" 200 123`)

_, err := fmt.Fscanf(r, `%s - %s %s %s %s %s %s %d %d`,
&host, &user, &date, &tzOffset, &verb, &route, &proto, &code,
&size)

if err != nil {
log.Fatal(err)
}

date = date[1:] + " " + tzOffset[:len(tzOffset)-1]
httpString := verb[1:] + " " + route + " " + proto[:len(proto)-1]

fmt.Println(host, user, date, httpString, code, size)
}

这里我们在解析时忽略日期和 HTTP 字符串两边的括号和引号,然后再将其删除。

输出:

127.0.0.1 james 09/May/2018:16:00:39 +0000 GET /report HTTP/1.0 200 123

关于go - 为什么我使用 fmt.Fscanf 时得到 "input does not match format"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57136639/

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