go net/url:为空片段添加URL.ForceFragment,类似于ForceQuery,以'#'进行字符串化,

5hcedyr0  于 5个月前  发布在  Go
关注(0)|答案(6)|浏览(45)

你使用的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("#")

现在 navlocal 是相等的,这意味着无法区分文档本地链接和导航链接。

kiayqfof

kiayqfof2#

在你的 "What did you expect to see?" 部分,你期望 u.Fragment 的值为 # ,但实际上它的文档记录如下:
https://golang.org/pkg/net/url/#URL.Fragment

Fragment   string    // fragment for references, without '#'

显然,这不能按照你的预期工作。
我们可能可以像为 https://golang.org/pkg/net/url/#URL.ForceQuery 添加 URL.ForceFragment 那样做。

eimct9ow

eimct9ow3#

"你期望看到什么?"这个问题的措辞可能不太恰当。我只是在说API没有办法区分这两种情况。
看起来ForceFragment可能是解决这个问题的最佳API。

qyuhtwio

qyuhtwio4#

@bradfitz 所以他看到了我的回复。

ee7vknir

ee7vknir5#

我看到了所有的回复,包括你上周的。我只是没有什么要补充的了。
我们现在正处于Go 1.12版本冻结阶段( https://github.com/golang/go/wiki/Go-Release-Cycle ),所以这不是一个优先事项。

rmbxnbpk

rmbxnbpk6#

不用担心,只是想检查一下。干杯。

相关问题