cordmana
cordmana

Reputation: 151

invalid receiver error when using Gin Gonic framework in Go

I am trying to use an external (non anonymous) function in the routing of my Gin based web server as shown below:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()

    router.GET("/hi/", Hi)

    router.Run(":8080")
}
func (c *gin.Context) Hi() {

    c.String(http.StatusOK, "Hello")
}

But I get 2 errors:

./main.go:13:23: undefined: Hi
./main.go:18:6: cannot define new methods on non-local type gin.Context

I am wondering how I can use anonymous functions in my endpoint handlers with gin gonic? All the documentation I've found so far uses anonymous functions.

Thanks!

Upvotes: 0

Views: 758

Answers (2)

AlexanderXing
AlexanderXing

Reputation: 304

package main

import "github.com/gin-gonic/gin"

func main() {
    router := gin.Default()

    router.GET("/hi", hi)
    var n Node
    router.GET("/hello", n.hello)
    router.GET("/extra", func(ctx *gin.Context) {
        n.extra(ctx, "surprise~")
    })

    router.Run(":8080")
}

func hi(c *gin.Context) {
    c.String(200, "hi")
}

type Node struct{}

func (n Node) hello(c *gin.Context) {
    c.String(200, "world")
}

func (n Node) extra(c *gin.Context, data interface{}) {
    c.String(200, "%v", data)
}

Upvotes: 1

Burak Serdar
Burak Serdar

Reputation: 51497

You can only define a new method for a type in the same package declaring that type. That is, you cannot add a new method to gin.Context.

You should do:

func Hi(c *gin.Context) {
...

Upvotes: 1

Related Questions