3 回答
TA贡献1804条经验 获得超7个赞
net.URL 文档中定义的格式是以下之一:
[scheme:][//[userinfo@]host][/]path[?query][#fragment]
scheme:opaque[?query][#fragment]
是可选的scheme:,但双斜杠是该host字段的一部分。这意味着您输入的有效字符串是://hello.com:81这将导致:
u, _ := url.Parse("//hello.com:81")
fmt.Println("host:", u.Host)
// Output: host: hello.com:81
你需要把你的输入变成有效的东西。如果您知道字符串从不包含该方案,您可以简单地在前面加上//. 如果您有时只指定了一个方案,您可以尝试有条件地操作输入。
TA贡献1775条经验 获得超11个赞
如果您需要处理仅包含主机和端口(没有方案和其他参数)的 URL,您可以使用以下代码:
host, port, err := net.SplitHostPort("hello.com:81")
fmt.Println("host:", host, "port:", port, "err:", err)
// output: host: hello.com port: 81 err <nil>
注意SplitHostPort()不适合解析标准网址(符合[scheme:][//[userinfo@]host][/]path[?query][#fragment])
TA贡献1995条经验 获得超2个赞
根据 go doc,表示的一般 url 形式为:
[scheme:][//[userinfo@]host][/]path[?query][#fragment]
方案后不以斜杠开头的 URL 被解释为:
scheme:opaque[?query][#fragment]
您的 URL 被解析为第二种格式。
您可以使用此方法获得预期的结果。在函数中,如果 URL 中没有方案,我们添加它,然后再次解析它以获得预期的结果。
func parseRawURL(rawurl string) (domain string, scheme string, err error) {
u, err := url.ParseRequestURI(rawurl)
if err != nil || u.Host == "" {
u, repErr := url.ParseRequestURI("https://" + rawurl)
if repErr != nil {
fmt.Printf("Could not parse raw url: %s, error: %v", rawurl, err)
return
}
domain = u.Host
err = nil
return
}
domain = u.Host
scheme = u.Scheme
return
}
- 3 回答
- 0 关注
- 159 浏览
添加回答
举报
