Google Go и сфера / функции - PullRequest
1 голос
/ 18 марта 2010

На одном из примеров серверов, приведенных на golang.org:

package main

import (
    "flag"
    "http"
    "io"
    "log"
    "template"
)

var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18
var fmap = template.FormatterMap{
    "html": template.HTMLFormatter,
    "url+html": UrlHtmlFormatter,
}
var templ = template.MustParse(templateStr, fmap)

func main() {
    flag.Parse()
    http.Handle("/", http.HandlerFunc(QR))
    err := http.ListenAndServe(*addr, nil)
    if err != nil {
        log.Exit("ListenAndServe:", err)
    }
}

func QR(c *http.Conn, req *http.Request) {
    templ.Execute(req.FormValue("s"), c)
}

func UrlHtmlFormatter(w io.Writer, v interface{}, fmt string) {
    template.HTMLEscape(w, []byte(http.URLEscape(v.(string))))
}


const templateStr = `
<html>
<head>
<title>QR Link Generator</title>
</head>
<body>
{.section @}
<img src="http://chart.apis.google.com/chart?chs=300x300&cht=qr&choe=UTF- 8&chl={@|url+html}"
/>
<br>
{@|html}
<br>
<br>
{.end}
<form action="/" name=f method="GET"><input maxLength=1024 size=70
name=s value="" title="Text to QR Encode"><input type=submit
value="Show QR" name=qr>
</form>
</body>
</html>
`  

Почему template.HTMLEscape(w, []byte(http.URLEscape(v.(string)))) содержится в UrlHtmlFormatter? Почему он не может быть напрямую связан с "url+html"?

Кроме того, как я могу изменить func QR для принятия значений параметров? Для этого я бы хотел принять флаг командной строки вместо req *http.Request ... Заранее спасибо ...

Ответы [ 2 ]

1 голос
/ 18 марта 2010

Подпись для функции template.HTMLEscape:

func(w io.Writer, s []byte)

Объявление типа для template.FormatterMap:

type FormatterMap map[string]func(io.Writer, interface{}, string)

Следовательно, сигнатура для функции значения элемента карты FormatterMap:

func(io.Writer, interface{}, string)

Функция UrlHtmlFormatter является оберткой, которая дает функции HTMLEscape сигнатуру функции значения элемента карты FormatterMap.

func UrlHtmlFormatter(w io.Writer, v interface{}, fmt string) {
    template.HTMLEscape(w, []byte(http.URLEscape(v.(string))))
}
0 голосов
/ 18 марта 2010

Вы отредактировали свой оригинальный вопрос, чтобы добавить второй вопрос.

Кроме того, как я могу изменить func QR на принять значения параметров? Что бы я хотел для этого нужно принять командную строку флаг вместо запроса * http.Request.

Если вы прочитаете Спецификация языка программирования Go , §Типы , включая §Функции типов , вы увидите, что Go имеет строгую статическую типизацию, включая функцию типы. Хотя это не гарантирует перехвата всех ошибок, обычно оно отлавливает попытки использовать недопустимые несоответствующие сигнатуры функций.

Вы не говорите нам, почему вы хотите изменить сигнатуру функции для QR, что выглядит произвольным и капризным образом, чтобы он больше не был действительным типом HandlerFunc, гарантируя, что программа не сможет даже скомпилировать. Мы можем только догадываться, чего вы хотите достичь. Возможно, это так просто: вы хотите изменить http.Request, основываясь на параметре времени выполнения. Возможно, как-то так:

// Note: flag.Parse() in func main() {...}
var qrFlag = flag.String("qr", "", "function QR parameter")

func QR(c *http.Conn, req *http.Request) {
    if len(*qrFlag) > 0 {
        // insert code here to use the qr parameter (qrFlag)
        // to modify the http.Request (req)
    }
    templ.Execute(req.FormValue("s"), c)
}

Возможно, нет! Кто знает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...