我正在尝试编译我的应用程序但是收到以下错误:
panic:运行时错误:无效的内存地址或nil指针取消引用 [信号SIGSEGV:分段违规代码= 0x1 addr = 0x0 pc = 0x14d6572]
goroutine 1 [正在运行]: github.com/gin-gonic/gin.(*Engine).Use(0x0,0xc420201f30,0x1,0x1,0x2,0x2) /Users/jordan.kasper/go/src/github.com/gin-gonic/gin/gin.go:227 + 0x22 杜松子酒样本应用内/ handlers.InitializeRoutes() /Users/jordan.kasper/go/src/gin-sample-app/handlers/routes.go:15 + 0x61 main.main() /Users/jordan.kasper/go/src/gin-sample-app/main.go:25 + 0x77
这是我的主要内容:
package main
import (
"gin-sample-app/handlers"
"github.com/gin-gonic/gin"
)
var router *gin.Engine
func main() {
// Set Gin to production mode
gin.SetMode(gin.ReleaseMode)
// Set the router as the default one provided by Gin
router = gin.Default()
// Process the templates at the start so that they don't have to be loaded
// from the disk again. This makes serving HTML pages very fast.
router.LoadHTMLGlob("templates/*")
// Initialize the routes
handlers.InitializeRoutes()
// Start serving the application
router.Run()
}
这是我的InitializeRoutes:
package handlers
import (
"gin-sample-app/middleware"
"github.com/gin-gonic/gin"
)
// initializing the routes
func InitializeRoutes() {
var router *gin.Engine
// Use the setUserStatus middleware for every route to set a flag
// indicating whether the request was from an authenticated user or not
router.Use(middleware.SetUserStatus())
// Handle the index route
router.GET("/", ShowIndexPage)
// Group user related routes together
userRoutes := router.Group("/u")
{
// Handle the GET requests at /u/login
// Show the login page
// Ensure that the user is not logged in by using the middleware
userRoutes.GET("/login", middleware.EnsureNotLoggedIn(), showLoginPage)
// Handle POST requests at /u/login
// Ensure that the user is not logged in by using the middleware
userRoutes.POST("/login", middleware.EnsureNotLoggedIn(), performLogin)
// Handle GET requests at /u/logout
// Ensure that the user is logged in by using the middleware
userRoutes.GET("/logout", middleware.EnsureLoggedIn(), logout)
// Handle the GET requests at /u/register
// Show the registration page
// Ensure that the user is not logged in by using the middleware
userRoutes.GET("/register", middleware.EnsureNotLoggedIn(), showRegistrationPage)
// Handle POST requests at /u/register
// Ensure that the user is not logged in by using the middleware
userRoutes.POST("/register", middleware.EnsureNotLoggedIn(), register)
}
// Group article related routes together
articleRoutes := router.Group("/article")
{
// Handle GET requests at /article/view/some_article_id
articleRoutes.GET("/view/:article_id", getArticle)
// Handle the GET requests at /article/create
// Show the article creation page
// Ensure that the user is logged in by using the middleware
articleRoutes.GET("/create", middleware.EnsureLoggedIn(), showArticleCreationPage)
// Handle POST requests at /article/create
// Ensure that the user is logged in by using the middleware
articleRoutes.POST("/create", middleware.EnsureLoggedIn(), createArticle)
}
}
我仍然是Go的新手所以我不确定发生了什么。但是这个程序最初是从同一个包中的所有文件开始的,但我现在正试图将它分开。它在拆分之前有效,所以可能只是我所说的方式吗?
答案 0 :(得分:3)
你在InitializeRoutes()函数中有一个var router *gin.Engine
,你没有在该行之后将路由器设置为任何东西,所以当你尝试稍后在函数中使用它时它是零。在函数内部声明的这个是封装包级别1并导致您的问题,删除该行。