1 回答

TA貢獻1887條經驗 獲得超5個贊
該錯誤來自如何Fscanf
解析空格分隔的字符串。讀取日期和 HTTP 字符串時,這會成為一個問題:
當它讀取日期時,09/May/2018:16:00:39 +0000
它不會讀取日期,而是會讀取直到第一個空格:09/May/2018:16:00:39
然后是expect?]
。
要解決此問題,將字符串解析為 是有意義的[%s %s]
,但這會更巧妙地失敗。它將解析時區,+0000]
因為它停在第一個空格處,而不是根據格式字符串。HTTP 字符串也會出現同樣的問題:它在動詞之后停止解析GET
,然后在路由之后停止/report
解析,但是在讀取協議時它讀取HTTP/1.0"
not?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
- 1 回答
- 0 關注
- 165 瀏覽
添加回答
舉報