Go语言中url.Parse解析含特殊字符URL报错求助
Go语言url.Parse解析URL时端口无效错误分析与解决
解析URL时触发如下panic:
panic: parse "http://x:SmT2fH": invalid port ":SmT2fH" after host
使用的代码如下:
s := "http://x:S%40mT2fH#%25PVfTA5gjCtn@host:5432/default" u, err := url.Parse(s) if err != nil { panic(err) } fmt.Println(u)
期望解析出用户名为x,密码为S%40mT2fH#%25PVfTA5gjCtn,但解析器误将部分内容识别为无效端口。
问题原因
- URL中的
#是**片段标识符(Fragment)**的起始标记,解析器会将#之后的所有内容直接识别为URL的片段部分,而非用户信息(Userinfo)的组成部分。 - 你的URL中
#未进行URL编码,导致解析器在遇到#时直接截断,把http://x:S%40mT2fH当成了协议+主机端口段:x被识别为主机,:S%40mT2fH被识别为端口,但端口必须是数字格式,因此触发"invalid port"错误。
解决方案
需要对密码中的#进行URL编码,替换为%23,修改后的URL代码如下:
s := "http://x:S%40mT2fH%23%25PVfTA5gjCtn@host:5432/default"
此时url.Parse会正确识别用户信息:
- 用户名:
x - 密码:
S%40mT2fH#%25PVfTA5gjCtn(可通过u.User.Password()获取解码后的密码)
内容的提问来源于stack exchange,提问作者Mojtaba Arezoomand
相关产品推荐
相关产品推荐

