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

パッケージ fmt

フォーマット エラー:

文字列を に指定するなど、動詞に無効な引数が指定された場合%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

すべてのエラーは文字列で始まり、"%!"場合によっては 1 文字 (動詞) が続き、括弧で囲まれた説明で終わります。

Errorまたはメソッドが印刷ルーチンによって呼び出されたときに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 に答える