使用fmt.Printf打印URL的行为非常奇怪

时间:2018-03-20 09:36:53

标签: url go

如果我将URL保存在数据库中

https://xxx.amazonaws.com/sub%2Fsub1/1495771021869-3sx5ims88vu-12f63aaa7d278435e1800486b31f9cc7/xxx.jpg

http.ResponseWriter以下列格式返回

https://xxx.amazonaws.com/sub!F(MISSING)sub1/1495771021869-3sx5ims88vu-12f63aaa7d278435e1800486b31f9cc7/xxx.jpg

在上面的网址中你可以看到%2F被替换为!F(MISSING)

可以帮助解决这个问题吗

以下是代码段 ``rs.WriteHeader(retObj.HttpStatus)

jsonStr, res := ConvObjectToJSON(retObj)
if res != nil {
    Logger(ctx, cnst.LogError, "In writeReturnError error in ConvObjectToJSON: %v Original object:%v",
        res.GetMessageWDetails(), retObj)
    rs.WriteHeader(http.StatusInternalServerError)
    return
}

var consoleLog *log.Logger = log.New(os.Stdout, cnst.LogPrefix, log.Ldate|log.Ltime)
consoleLog.Print(jsonStr)

cnt, err := fmt.Fprintf(rs, jsonStr)
if nil == err && 0 < cnt {
    rs.Header().Set("Content-Type", "application/json")
} else {
    Logger(ctx, cnst.LogError, "In writeReturnError error in fmt.Fprintf: %v Original JSON:%v",
        err.Error(), jsonStr)
    rs.WriteHeader(http.StatusInternalServerError)
}

``

我对fmt.Fprintf

有疑问

1 个答案:

答案 0 :(得分:5)

正如评论中所提到的:你的问题是Fprintf使用第二个参数作为一种格式,将每个%解释为一个指标,它应该在那里插入一个变量。在您的字符串中有一个%符号,但您没有提供任何插入参数。所以它写作MISSING

由于您不想格式化任何内容(似乎)只需使用此代码:

cnt, err := fmt.Fprint(rs, jsonStr)