2016-09-17 172 views
1

調用golang功能,我需要使用地圖的幾個鍵來創建JSON數據,需要納入生成的html。我正在使用pongo2庫,並希望編寫自定義過濾器來實現相同。pongo2 - 從猩猩模板

<script> {{ CategoryMapping|MycustomFilter }} </script> 

,並像下面編碼自定義過濾器。

func init() { 

    pongo2.RegisterFilter("superfilter", GetCategoryJsonData) 


} 

func GetCategoryJsonData(CatAttributeMapping *map[string]interface{}, param *int) (*string, *error) { 
..... 
} 

但是我得到錯誤以下。

src/util/TemplateFilters.go:10: cannot use GetCategoryJsonData (type func(*int, *int) (*string, *error)) as type pongo2.FilterFunction in argument to pongo2.RegisterFilter 

我按照下面的文檔 - https://godoc.org/github.com/flosch/pongo2#FilterFunction

我是新來的快去無法明白自己做錯了什麼,我在這裏做什麼。請引導我一樣。

+0

你的功能需要有簽名'FUNC(在* pongo2.Value帕拉姆·pongo2.Value)(出* pongo2.Value ,err * pongo2.Error)' – jcbwlkr

+0

@ jcdwlkr-我讀了文檔,但我無法制作一個用例或實際工作代碼。如果你可以給一個樣本,它會有很大的幫助。 – virus

回答

3

的問題是,你的過濾函數不接受或返回的權利類型以匹配pongo2的需要。讓我們瀏覽一下文檔,看看他們想要什麼。

首先來看看godoc爲RegisterFilterFunction。它說

func RegisterFilter(name string, fn FilterFunction) 

這是pongo2包,所以你應該閱讀這是RegisterFilter是接受兩個參數和返回值沒有的功能。第一個參數是name的內建類型的string,第二個參數是fn類型pongo2.FilterFunction的。但什麼是pongo2.FilterFunction?那麼點擊它,我們看到在doc

type FilterFunction func(in *Value, param *Value) (out *Value, err *Error) 

在圍棋,你可以基於任何其他類型,包括功能,使自己的類型進一步下跌。那麼,什麼pongo2所做的就是創建一個名爲類型,稱爲FilterFunction就是它接受兩個參數(包括*pongo2.Value型)和返回兩個值(*pongo2.value類型之一,*pongo2.Error類型之一)任何FUNC。

要整合所有我們會做這樣的事情:

package main 

import (
    "fmt" 
    "log" 
    "strings" 

    "github.com/flosch/pongo2" 
) 

func init() { 
    pongo2.RegisterFilter("scream", Scream) 
} 

// Scream is a silly example of a filter function that upper cases strings 
func Scream(in *pongo2.Value, param *pongo2.Value) (out *pongo2.Value, err *pongo2.Error) { 
    if !in.IsString() { 
     return nil, &pongo2.Error{ 
      ErrorMsg: "only strings should be sent to the scream filter", 
     } 
    } 

    s := in.String() 
    s = strings.ToUpper(s) 

    return pongo2.AsValue(s), nil 
} 

func main() { 
    tpl, err := pongo2.FromString("Hello {{ name|scream }}!") 
    if err != nil { 
     log.Fatal(err) 
    } 
    // Now you can render the template with the given 
    // pongo2.Context how often you want to. 
    out, err := tpl.Execute(pongo2.Context{"name": "stack overflow"}) 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Println(out) // Output: Hello STACK OVERFLOW! 
}