【发布时间】:2020-09-04 19:31:34
【问题描述】:
在 Go 中,我想检查以下字符串是否在字符串中包含 text/plain。函数strings.Contains() 总是返回false。
我本地的go版本是go1.14.3 windows/amd64,我的服务器版本是go1.13.3 linux/amd64
测试代码 (play.golang.org/p/_ikCzWd6438)
var test = "text/plain; charset=utf-8"
fmt.Println("my string:", test)
fmt.Println("strings.Contains(text/plain)", strings.Contains("text/plain", test))
fmt.Println("strings.Contains(text)", strings.Contains("text", test))
fmt.Println("strings.Contains(charset)", strings.Contains("charset", test))
var test2 = strings.ReplaceAll(test, "/", "") // remove slash
fmt.Println("my second string:", test2)
fmt.Println("strings.Contains(textplain)", strings.Contains("textplain", test2))
fmt.Println("strings.Contains(text)", strings.Contains("text", test2))
fmt.Println("strings.Contains(charset)", strings.Contains("charset", test2))
输出
my string: text/plain; charset=utf-8
strings.Contains(text/plain) false
strings.Contains(text) false
strings.Contains(charset) false
my second string: textplain; charset=utf-8
strings.Contains(textplain) false
strings.Contains(text) false
strings.Contains(charset) false
那么为什么返回strings.Contains() 总是'false'?
【问题讨论】:
-
Contains的参数顺序错误。使用 `Contains(test,"text/plain") -
@Burak 真丢人。你是对的!
-
请注意,永远不要使用
contains来测试媒体类型。这将导致误报。有人可能正在使用“customtext/plain”或text/plain+mycustomizations或什至image/jpeg; foo=text/plain或任何其他随机组合的媒体类型,它们会愚弄你的逻辑,但仍然有效。相反,使用mime.ParseMediaType正确解析媒体类型。 -
@flimzy 我向外部页面发送请求并检查目标页面是否为文本文件(内容类型文本/纯文本)。有些页面在内容类型中仍然有一个字符集,所以我只想检查它是否是内容类型包含文本/纯文本。这只是我测试功能的一小部分。
-
我明白你想要做什么。我是说检查字符串是否包含会导致误报,因此您应该正确解析媒体类型。
Content-Type: footext/plainbar、Content-Type: text/plain+custom和Content-Type: image/jpeg; foo=text/plain都是有效的 Content-Type 值,都会破坏您的测试。
标签: string go compare contains