go语言和url Go语言和java

URL中的空格、加号究竟应该使用何种方式编码 URL中不能显示地包含空格这已经是一个共识go语言和url,而空格以何种形式存在 , 在不同的标准中又不完全一致,以致于不同的语言也有go语言和url了不同的实现 。
rfc2396 中明确表示空格应该被编码为 %20。
而W3C的标准中却又说空格可以被替换为 + 或者 %20。
老许当场懵逼,空格被替换为 + ,那 + 本身只能被编码 。既然如此,为什么不直接对空格进行编码呢 。当然这只是老许心中的疑惑,以前的背景go语言和url我们已经无法追溯,已成的事实go语言和url我们也无法改变 。但,空格到底是被替换为 + 还是 20% ,+ 是否需要被编码都是现在的我们需要直面的问题 。
作为Gopher最先关注的自然是Go语言本身的实现 , 因此我们首先了解一下Go中常用的三种URL编码方式的异同 。
使用 url.QueryEscape 编码时,空格被编码为 + ,而 + 本身被编码为 %2B。
使用 url.PathEscape 编码时,空格被编码为 20% , 而 + 则未被编码 。
使用 (Values).Encode 方法编码时,空格被编码为 + ,而 + 本身被编码为 %2B,进一步查看 (Values).Encode 方法的源码知其内部仍旧调用 url.QueryEscape 函数 。而 (Values).Encode 方法和 url.QueryEscape 的区别在于前者仅编码query中的key和value,后者会对 = 、均进行编码 。
对我们开发者而言,这三种编码方式到底应该使用哪一种,请继续阅读后文相信你可以在后面的文章中找到答案 。
既然空格和 + 在Go中的URL编码方式有不同的实现 , 那在其他语言中是否也存在这样的情况呢,下面以PHP和JS为例 。
urlencode
rawurlencode
PHP的 urlencode 和Go的 url.QueryEscape 函数效果一致 , 而 rawurlencode 则将空格和 + 均进行编码 。
encodeURI
encodeURIComponent
JS的 encodeURI 和Go的 url.PathEscape 函数效果一致,而 encodeURIComponent 则将空格和 + 均进行编码 。
在前文中已经总结了 Go 、 PHP 和 JS 对 +Gopher指北 的编码操作,下面总结一下其对应的解码操作是否可行的二维表 。
上表中的 YY 和 Y 同含义,老许仅以 YY 表示在Go中推荐使用 url.PathEscape 进行编码,同时在PHP和JS中分别推荐使用 rawurldecode 和 decodeURIComponent 进行解码 。
在实际的开发过程中,Gopher一定会存在需要解码的场景,此时就需要和URL编码方进行沟通以得到合适的方式解码 。
那有没有通用的不需要URL编解码的方式呢?毫无疑问是有的!以 base32 编码为例,其编码字符集为 A-Z和数字2-7  , 此时对值进行base32编码后就无需url编码了 。
最后,衷心希望本文能够对各位读者有一定的帮助 。
参考
GO语言(二十七):管理依赖项(下)-当您对外部模块的存储库进行了 fork (例如修复模块代码中的问题或添加功能)时,您可以让 Go 工具将您的 fork 用于模块的源代码 。这对于测试您自己的代码的更改很有用 。
为此,您可以使用go.mod 文件中的replace指令将外部模块的原始模块路径替换为存储库中 fork 的路径 。这指示 Go 工具在编译时使用替换路径(fork 的位置),例如,同时允许您保留import 原始模块路径中的语句不变 。
在以下 go.mod 文件示例中,当前模块需要外部模块example.com/theirmodule 。然后该replace指令将原始模块路径替换为example.com/myfork/theirmodule模块自己的存储库的分支 。
设置require/replace对时 , 使用 Go 工具命令确保文件描述的需求保持一致 。使用go list命令获取当前模块正在使用的版本 。然后使用go mod edit命令将需要的模块替换为fork:

推荐阅读