ошибка отправки функции в go html / template: функция » » не определена

#function #go #go-templates

#функция #Вперед #go-шаблоны

Вопрос:

Я не могу отправить функцию в template, когда использую другой файл вместо main.go

моя проблема во второй части.

Первая часть: (первая часть работает нормально.)

Я могу отправить функцию-> «humanSize» в шаблон-> «temp.gohtml»

это мой каталог:

 app
|____main.go
|____templates
      |_____index
             |_____temp.gohtml
  

когда я пишу код, подобный blow, он работает нормально:

 import (
    "html/template"
    "log"
    "net/http"
    "os"
)

var funcMap = template.FuncMap{
    "humanSize": humanSize,
}

var tpl *template.Template

func init() {
    tpl = template.Must(template.New("").Funcs(funcMap).ParseFiles("templates/index/temp.gohtml"))
}
func humanSize() string {
    return "qqqqqqqqqqqqqqqqqqqqq"
}

func getPageHandler(w http.ResponseWriter, r *http.Request) {

    err := tpl.ExecuteTemplate(os.Stdout,"temp.gohtml", nil)
    if err != nil {
        log.Fatalln(err)
    }
}

func main() {
    http.HandleFunc("/", getPageHandler)
    http.ListenAndServe(":8082", nil)
}
  

это код templates/index/temp.gohmtl :

 <html>
    <body>
        {{humanSize}}
    </body>
</html>
  

вывод в порядке:

 <html>
<body>

qqqqqqqqqqqqqqqqqqqqq
</body>
</html>

  

Вторая часть: (У меня здесь проблема.)

Я хочу переместить код из main.go в controller / index.go

это мой новый каталог:

 app
|____main.go
|____templates
|      |_____index
|             |_____temp.gohtml
|____controller
       |_____index.go
       |_____login.go     

//Answer: I edited this line just for another person wants to know what was the problem...I have imported some files in login.go same as index.go that cause "relative imports" and I got the error. in index.go also we have "relative imports" with config.go

  

Я пишу код в main.go :

 import (
    Con "./controller"
    "net/http"
)

func main() {
    http.HandleFunc("/", Con.GetPageHandler)
    http.ListenAndServe(":8082", nil)
}
  

и я пишу код в controller / index.go :

 package controller

import (
    "html/template"
    "log"
    "net/http"
    "os"
)

var funcMap = template.FuncMap{
    "humanSize": humanSize,
}

var tpl *template.Template

func init() {
    tpl = template.Must(template.New("").Funcs(funcMap).ParseFiles("templates/index/temp.gohtml"))
}
func humanSize() string {
    return "qqqqqqqqqqqqqqqqqqqqq"
}

func GetPageHandler(w http.ResponseWriter, r *http.Request) {

    err := tpl.ExecuteTemplate(os.Stdout,"temp.gohtml", nil)
    if err != nil {
        log.Fatalln(err)
    }
}
  

Ошибка:

 2019/04/12 21:44:49 template: temp.gohtml:11: function "humanSize" not defined
  

резюме: когда я пишу код в main.go, я могу отправить функцию в шаблон, но когда я код в controller / index.go, я не могу отправить функцию в template.

Комментарии:

1. Я скопировал ваш проект и не вижу ошибки, которую вы видите. Единственное отличие в моем тесте в том, что я не использовал относительные пути импорта, которые вы также не должны использовать, никто не должен.

2. Не используйте относительный импорт . Фактическая проблема, по-видимому, связана с тем, что вы загружаете все шаблоны в свой конфигурационный пакет, который импортируется пакетом контроллера в файле login.go, попробуйте прокомментировать код в этом файле, и ваше приложение будет работать.

3. Если вы используете $GOPATH then, применяются старые правила, прочитайте это сообщение в блоге для получения дополнительной информации ( как написать код Go ). Короче говоря, каждый путь импорта должен соответствовать пути к папке пакета относительно $GOPATH/src/ . Например, если пакет контроллера находится в $GOPATH/src/app/controller , то путь импорта app/controller . Стандартной практикой является то github.com/username/ , что ваши проекты работают под управлением, поэтому ваш друг предложил <github-path> , но это не обязательно, необходимо, чтобы ваш проект жил под $GOPATH/src/ управлением и так далее…

4. … вы используете правильный путь импорта. Правила немного отличаются, если вы используете модули go и работаете вне $GOPATH . Если это так, прочитайте эту статью . В этом случае правильный путь импорта вложенной папки должен включать путь к модулю.

5. Используете $GOPATH ли modules вы или не должны использовать относительные пути импорта, такие как ./controller или ../../controller , это не только плохая практика, но я считаю, что это работает не при всех обстоятельствах, поэтому вам следует избегать этого.