卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章64334本站已运行4115

为什么 gourl.ParseQuery 方法的结果如此意外?

为什么 gourl.parsequery 方法的结果如此意外?

在PHP开发中,gourl.ParseQuery方法被广泛应用于解析URL查询字符串。然而,有时候我们会发现该方法的结果出乎意料,出现了一些令人困惑的情况。为什么会出现这种意外?php小编百草将在本文中探讨这个问题,并提供一些解决方法。让我们一起来看看吧!

问题内容

该程序的结果是{"x":["1 1 3"], "y":["2", "3"]}。 但为什么不是 {"x":["1+1+3"], "y":["2", "3"]} 呢? 我需要做什么才能得到预期的结果"1+1+3"

import (
    "encoding/json"
    "fmt"
    "log"
    "net/url"
    "strings"
)

func main() {
    m, err := url.ParseQuery(`x=1+1+3&y=2&y=3`)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(toJSON(m))
}

func toJSON(m any) string {
    js, err := json.Marshal(m)
    if err != nil {
        log.Fatal(err)
    }
    return strings.ReplaceAll(string(js), ",", ", ")
}

沙盒:https://go.dev/play/p/o0tirtvpaqk

{"x":["1+1+3"], "y":["2", "3"]}

解决方法

url.parsequery+ 替换为

相关代码片段:

case '+':
            if mode == encodequerycomponent {
                t.writebyte(' ')
            } else {
                t.writebyte('+')
            }

解决办法是编码+(替换为%2b

像这样:

import (
    "encoding/json"
    "fmt"
    "log"
    "net/url"
    "strings"
)

func main() {
    m, err := url.ParseQuery(`x=1%2B1%2B3&y=2&y=3`)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(toJSON(m))
}

func toJSON(m any) string {
    js, err := json.Marshal(m)
    if err != nil {
        log.Fatal(err)
    }
    return strings.ReplaceAll(string(js), ",", ", ")
}
卓越飞翔博客
上一篇: Go 冒号等于运算符和一个新变量
下一篇: 如何使用工作区方法扩展克隆的 golang 库
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏