Reputation: 25
I am trying to compile my go app but am getting the following error:
panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x14d6572]
goroutine 1 [running]: 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 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
This is my main:
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()
}
This is my 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)
}
}
I am still pretty new to Go so I am not exactly sure what is going on. However this program originally started with all the files in the same package but I am now trying to separate it. It worked before the split so might be just the way I am calling it?
Upvotes: 1
Views: 5601
Reputation: 19040
You have a var router *gin.Engine
inside the InitializeRoutes() function, you don't set router after that line to anything so its nil when you try to use later in the function. This one declared inside the function is shadowing the package level one and causing your problems, delete that line.
Upvotes: 3