你使用的Go版本是什么( go version
)?
go version go1.11.2 linux/amd64
你做了什么?
import (
"fmt"
"log"
"net/url"
)
func main() {
u, err := url.Parse("http://example.com/#")
if err != nil {
log.Fatal(err)
}
fmt.Println(u.String())
fmt.Println(u.Fragment)
}
你期望看到什么?
http://example.com/#
#
你看到了什么?
http://example.com/
问题出在哪里?
乍一看, http://example.com/#
和 http://example.com/
在逻辑上是相同的URL。在浏览器导航到输入的URL时,这基本上是正确的,但它们在链接中略有不同。如果用户点击以下链接:
<a href="http://example.com/#">foo</a>
如果文档URL(或 <base href>
)是 http://example.com/
,那么这个点击不会导致导航 - 它是一个文档内的链接。然而,如果链接是:
<a href="http://example.com/">foo</a>
那么点击它就会导致导航。实际上是重新加载,但仍然算是导航。
当使用net/url解析相对URL时,这个问题变得更严重:
<html>
<head>
<base href="http://example.com/">
</head>
<body>
<a href="/">reload</a>
<a href="#">inert</a>
</body>
</html>
base, _ = url.Parse("http://example.com/")
nav, _ = base.Parse("/")
local, _ = base.Parse("#")
现在 nav
和 local
是相等的,这意味着无法区分文档本地链接和导航链接。
6条答案
按热度按时间ne5o7dgx1#
/cc @bradfitz
kiayqfof2#
在你的 "What did you expect to see?" 部分,你期望
u.Fragment
的值为#
,但实际上它的文档记录如下:https://golang.org/pkg/net/url/#URL.Fragment
显然,这不能按照你的预期工作。
我们可能可以像为 https://golang.org/pkg/net/url/#URL.ForceQuery 添加
URL.ForceFragment
那样做。eimct9ow3#
"你期望看到什么?"这个问题的措辞可能不太恰当。我只是在说API没有办法区分这两种情况。
看起来ForceFragment可能是解决这个问题的最佳API。
qyuhtwio4#
@bradfitz 所以他看到了我的回复。
ee7vknir5#
我看到了所有的回复,包括你上周的。我只是没有什么要补充的了。
我们现在正处于Go 1.12版本冻结阶段( https://github.com/golang/go/wiki/Go-Release-Cycle ),所以这不是一个优先事项。
rmbxnbpk6#
不用担心,只是想检查一下。干杯。