代码之家  ›  专栏  ›  技术社区  ›  wyc

Go:如何在Go中使用func()bool参数?

  •  0
  • wyc  · 技术社区  · 11 年前

    这是Go中的示例代码 blackfriday 包裹:

    package main
    
    import (
        "bytes"
        "fmt"
        "github.com/russross/blackfriday"
    )
    
    func main() {
    
    input := []byte(`##Title
    
    - another paragragh
    
    This is a being rendered in a custom way.
    `)
    
        htmlFlags := 0
        renderer := &renderer{Html: blackfriday.HtmlRenderer(htmlFlags, "", "").(*blackfriday.Html)}
    
        extensions := 0
    
        unsanitized := blackfriday.Markdown(input, renderer, extensions)
        os.Stdout.Write(unsanitized)
    }
    
    // renderer implements blackfriday.Renderer and reuses blackfriday.Html for the most part,
    // except overriding Link rendering.
    type renderer struct {
        *blackfriday.Html
    }
    
    func (options *renderer) Header(out *bytes.Buffer, text func() bool, level int, id string) {
        fmt.Fprintf(out, "<custom link %q to %q>", content, link)
    }
    

    代码的目的是自定义 link 输出HTML的属性。

    我也尝试过,但是 p 标签:

    func (options *renderer) Paragraph(out *bytes.Buffer, text func() bool) {
        fmt.Fprintf(out, "<p class='custom'>%q</p>", text)
    }
    

    但结果是:

    <h1>Title</h1>
    
    <ul>
    <li>another paragragh</li>
    </ul>
    <p class='custom'>%!q(func() bool=0x80a15d0)</p>
    

    所以我不知道如何输出实际的文本( This is a being rendered in a custom way. ). 有什么想法吗?

    这是函数的源代码:

    func (options *Html) Paragraph(out *bytes.Buffer, text func() bool) {
        marker := out.Len()
        doubleSpace(out)
    
        out.WriteString("<p>")
        if !text() {
            out.Truncate(marker)
            return
        }
        out.WriteString("</p>\n")
    }
    
    2 回复  |  直到 11 年前
        1
  •  1
  •   Jaemin Park    11 年前

    我认为你对函数的使用是错误的。

    看看 Html.Paragraph 并将其覆盖。

    也许它看起来像:

    func (options *renderer) Paragraph(out *bytes.Buffer, text func() bool) {
        marker := out.Len()
        doubleSpace(out) 
    
        out.WriteString("<p class='custom'>")
        if !text() {
            out.Truncate(marker)
            return
        }
        out.WriteString("</p>\n")
    }
    
        2
  •  1
  •   sberry    11 年前

    我相信你只需要打电话 text

    func (options *renderer) Paragraph(out *bytes.Buffer, text func() bool) {
        fmt.Fprintf(out, "<p class='custom'>%q</p>\n", text())
    }