如何从包含多个逗号分隔值的标头中获取值。例如,
url := "https://accounts.google.com/.well-known/openid-configuration"
resp, err := http.Get(url)
field := resp.Header.Get("Cache-Control") // "public, max-age=3600"
在这种情况下,我希望获得max-age
值。我看到2个案例:
strings.Split()
,Trim()
等(我认为这不是个好主意)bufio.Scanner
与SplitFunc
一起使用(稍微好一点)任何好主意或最佳实践?
修改1。使用strings.FieldsFunc()
const input = " public,max-age=3000, anothercase "
sep := func(c rune) bool {
return c == ',' || c == ' '
}
values := strings.FieldsFunc(input, sep)
关于基准
BenchmarkTrim-4 2000000 861 ns/op 48 B/op 1 allocs/op
修改2。使用Scaner()
所以让我们对它进行基准测试
func ScanHeaderValues(data []byte, atEOF bool) (advance int, token []byte, err error) {
// Skip leading spaces.
var start int
for start = 0; start < len(data); start++ {
if data[start] != ' ' {
break
}
}
// Scan until comma
for i := start; i < len(data); i++ {
if data[i] == ',' {
return i + 1, data[start:i], nil
}
}
// If we're at EOF, we have a final, non-empty, non-terminated word. Return it.
if atEOF && len(data) > start {
return len(data), data[start:], nil
}
// Request more data.
return start, nil, nil
}
func BenchmarkScanner(b *testing.B) {
const input = " public,max-age=3000, anothercase "
scanner := bufio.NewScanner(strings.NewReader(input))
split := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
advance, token, err = ScanHeaderValues(data, atEOF)
return
}
scanner.Split(split)
b.ResetTimer()
for i := 0; i < b.N; i++ {
for scanner.Scan() {
// a := scanner.Text()
// b.Logf("%+v\n", a)
}
}
}
结果:
BenchmarkTrim-4 2000000 861 ns/op 48 B/op 1 allocs/op
BenchmarkScanner-4 50000000 21.2 ns/op 0 B/op 0 allocs/op
如果您有任何其他更好的解决方案,我希望看到它。
答案 0 :(得分:-1)
没有错:
url := "https://accounts.google.com/.well-known/openid-configuration"
resp, err := http.Get(url)
fields := strings.Split(resp.Header.Get("Cache-Control"), ",")
for i, field := range field {
fields[i] = strings.Trim(field, " ")
}
修改:如果缺少逗号后面的空格
,则现在可以使用编辑功能