2

所以这个问题让我困惑了一段时间!

这是控制台中的一些代码:

 func GetLoginLinks(w *http.ResponseWriter, r *http.Request) (string, error) {
    c := appengine.NewContext(r)
    u := user.Current(c)
    if u == nil {
        url, err := user.LoginURL(c, r.URL.String())
        if err != nil {
            http.Error(*w, err.Error(), http.StatusInternalServerError)
            return "", err
        }

        c.Debugf("Return url: " + r.URL.String())
        c.Debugf("login url: " + url)
        c.Debugf("url type: %T", url)
        v := LoginItem(url, "Login")
        return v, nil
    }
 }

它提供以下输出:

2013/06/17 21:48:28 DEBUG: Return url: /
2013/06/17 21:48:28 DEBUG: login url: /_ah/login?continue=http%A(MISSING)//localhost%A(MISSING)8080/
2013/06/17 21:48:28 DEBUG: url type: string

当上传到应用引擎本身时,这也会失败。

我正在苦苦挣扎的是函数的前 4 行直接来自开发人员指南。

4

1 回答 1

4

打包文件

格式错误:

如果为动词提供了无效参数,例如提供字符串 to %d,则生成的字符串将包含问题描述,如以下示例所示:

Wrong type or unknown verb: %!verb(type=value)
  Printf("%d", hi):          %!d(string=hi)
Too many arguments: %!(EXTRA type=value)
  Printf("hi", "guys"):      hi%!(EXTRA string=guys)
Too few arguments: %!verb(MISSING)
  Printf("hi%d"):            hi %!d(MISSING)
Non-int for width or precision: %!(BADWIDTH) or %!(BADPREC)
  Printf("%*s", 4.5, "hi"):  %!(BADWIDTH)hi
  Printf("%.*s", 4.5, "hi"): %!(BADPREC)hi

所有错误都以字符串开头,"%!"有时后跟单个字符(动词),并以带括号的描述结尾。

如果一个Erroror方法在 print 例程调用时String触发了一个,包会重新格式化来自恐慌的错误消息,并用它来自 包的指示来装饰它。例如,如果一个方法调用,生成的格式化消息将如下所示panicfmtfmtStringpanic("bad")

%s(PANIC=bad)

%s仅显示发生故障时正在使用的打印动词。

您的格式字符串无效。您有一个格式字符串中的转义 URL 查询字符串:“ :”被转义为“ %3A”。%3A" " 动词的格式参数丢失。为了安全起见,切勿使用任意字符串作为格式字符串。例如,

package main

import "fmt"

func main() {
    url := "/_ah/login?continue=http%3A//localhost%3A8080/"
    fmt.Printf("login url: " + url)
    fmt.Println()
    fmt.Printf("login url: %s", url)
    fmt.Println()
}

输出:

login url: /_ah/login?continue=http%A(MISSING)//localhost%A(MISSING)8080/
login url: /_ah/login?continue=http%3A//localhost%3A8080/

写:

c.Debugf("login url: %s", url)
于 2013-06-18T06:00:38.067 回答