panic:运行时错误:内存地址无效或 nil 指针取消引用时分解应用程序



>我正在尝试编译我的go应用程序,但收到以下错误:

panic:运行时错误:无效的内存地址或 nil 指针取消引用 [信号 SIGSEGV:分段违规代码=0x1 地址=0x0 pc=0x14d6572]
goroutine1 [正在运行]: github.com/gin-gonic/gin。(*引擎)。用途(0x0、0xc420201f30、0x1、0x1、0x2、0x2)/Users/jordan.kasper/go/src/github.com/gin-gonic/gin/gin.go:227 +0x22 gin-sample-app/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()
}

这是我的初始化路由:

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还很陌生,所以我不确定发生了什么。 但是,该程序最初是在同一包中的所有文件开始的,但现在我正在尝试将其分开。 它在分裂之前就起作用了,所以可能就是我所说的那样?

你在 InitializeRoutes() 函数中有一个var router *gin.Engine,你不会在该行之后将路由器设置为任何内容,所以当你稍后尝试在函数中使用时,它会为 nil。在函数中声明的这个正在隐藏包级别一并导致您的问题,请删除该行。

最新更新