#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
, это не только плохая практика, но я считаю, что это работает не при всех обстоятельствах, поэтому вам следует избегать этого.