Golang Gin c.Param undefined (тип * gin.Context не имеет поля или метода Param)

Я пробовал использовать Gin, который является фреймворком для Golang.
https://github.com/gin-gonic/gin

И я скопировал образцы кодов с официального github.
Вот так.

package main

import (
   "github.com/gin-gonic/gin"
   "net/http"
)

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

    router.GET("/user/:name", func(c *gin.Context) {
        name := c.Param("name")
        c.String(http.StatusOK, "Hello %s", name)
        })

    router.Run(":8080")
}

Но у меня ошибка.

# go run main.go
# command-line-arguments ./main.go:12: c.Param undefined (type *gin.Context has no field or method Param)

Кто-нибудь знает, как исправить проблему?

・ CentOS7

・ Go версия go1.6.3 linux / amd64

Редактировать:

Я вообще-то пользуюсь скольжением, но обновил джин как глобальный. А также обновите Go до 1.7, но с той же ошибкой:

# go get -u -v github.com/gin-gonic/gin
github.com/gin-gonic/gin (download)
github.com/golang/protobuf (download)
Fetching https://gopkg.in/go-playground/validator.v8?go-get=1
https fetch failed: Get https://gopkg.in/go-playground/validator.v8?go-get=1: dial tcp: lookup gopkg.in on 192.168.11.1:53: dial udp 192.168.11.1:53: i/o timeout
gopkg.in/go-playground/validator.v8 (download)
Fetching https://gopkg.in/yaml.v2?go-get=1
https fetch failed: Get https://gopkg.in/yaml.v2?go-get=1: dial tcp: lookup gopkg.in on 192.168.11.1:53: dial udp 192.168.11.1:53: i/o timeout
gopkg.in/yaml.v2 (download)
github.com/manucorporat/sse (download)
Fetching https://golang.org/x/net/context?go-get=1
Parsing meta tags from https://golang.org/x/net/context?go-get=1 (status code 200)
get "golang.org/x/net/context": found meta tag main.metaImport{Prefix:"golang.org/x/net", VCS:"git", RepoRoot:"https://go.googlesource.com/net"} at https://golang.org/x/net/context?go-get=1
get "golang.org/x/net/context": verifying non-authoritative meta tag
Fetching https://golang.org/x/net?go-get=1
Parsing meta tags from https://golang.org/x/net?go-get=1 (status code 200)
golang.org/x/net (download)

# go version
go version go1.7 linux/amd64

# go run test.go
# command-line-arguments
./test.go:12: c.Param undefined (type *gin.Context has no field or method Param)

person k16    schedule 16.08.2016    source источник
comment
ваша go get -u -v github.com/gin-gonic/gin загрузка не удалась: у вас проблемы с прокси-сервером или подключением к Интернету? Попробуйте снова   -  person    schedule 16.08.2016
comment
ой, попробовал еще раз и ошибок нет. но все равно не работает ...   -  person k16    schedule 17.08.2016


Ответы (5)


Изменить: OP имел «каталог поставщика, созданный Glide» со старой версией пакета. и проблема решена путем удаления этой папки (обновление пакета поставщика).

Примечание: go get никогда не проверяет и не обновляет код, хранящийся в каталогах поставщиков.


c.Param(key) - это ярлык для c.Params.ByName(key), см. c.Param(key) Документы:

// Param returns the value of the URL param.
// It is a shortcut for c.Params.ByName(key)
//        router.GET("/user/:id", func(c *gin.Context) {
//            // a GET request to /user/john
//            id := c.Param("id") // id == "john"
//        })
func (c *Context) Param(key string) string {
  return c.Params.ByName(key)
}

Вам нужно обновить пакет github.com/gin-gonic/gin, попробуйте:

go get -u github.com/gin-gonic/gin

Убедитесь, что там нет vendor, и попробуйте удалить все файлы и каталог поставщика, кроме main.go, затем go build (или обновите пакет поставщика).


Ваш код отлично работает в go1.7:

package main

import (
    "net/http"

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

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

    router.GET("/user/:name", func(c *gin.Context) {
        name := c.Param("name")
        c.String(http.StatusOK, "Hello %s", name)
    })

    router.Run(":8080")
}

Открыть в браузере http://127.0.0.1:8080/user/World
вывод:

Hello World
person Community    schedule 16.08.2016
comment
@ k16 Надеюсь, это поможет. - person ; 16.08.2016
comment
Спасибо. Я добавил сообщение в исходную форму. Как я уже писал, это не работает. Я думаю, что с моей докерной средой что-то не так, но я также не думаю, что это зависит от серверной среды. это странно. @Amd - person k16; 16.08.2016

У меня это сработало, но мне пришлось импортировать пакет http:

package main

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

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

router.GET("/user/:name", func(c *gin.Context) {
    name := c.Param("name")
    c.String(http.StatusOK, "Hello %s", name)
    })

router.Run(":8080")
}

go version возвращает мне go version go1.5.3 linux/amd64.

Кажется, ваша ошибка была в строке 19 вашего gin.go согласно './main.go:19: c.Param undefined'. Какие еще строки в скрипте?

Предоставленный сценарий состоит всего из 14 строк.

person sophisticasean    schedule 16.08.2016
comment
Спасибо. Я снова вставил правильный исходный код и ошибку. Но все равно возникает та же ошибка. хммм, похоже это зависит от версии Go ??? - person k16; 16.08.2016
comment
Да, я бы попробовал понизить рейтинг. Я не видел никакой информации о том, для какой версии golang gin подтверждена. - person sophisticasean; 16.08.2016

Я добился успеха.

Причина в глубине моего каталога. Я помещаю main.go в «/go/myproject/src/server/main.go» и устанавливаю «export GOPATH = / go / myproject».

В этом случае я получил ошибку. Но после того, как я изменил путь к main.go на «/go/myproject/src/main.go», он заработал.

Мне было интересно, что я не думал, что моя структура каталогов неправильная. Я могу добавить main.go любой глубины, не так ли?

Добавлено2

# pwd
/go/myproject/src/server
# ls -l
total 12
-rw-r--r-- 1 1000 ftp 633  8月 17 02:52 glide.lock
-rw-r--r-- 1 1000 ftp  78  8月 17 02:51 glide.yaml
-rw-r--r-- 1 1000 ftp 254  8月 17 02:51 main.go
drwxr-xr-x 1 1000 ftp 136  8月 17 02:52 vendor
# go run main.go
# command-line-arguments
./main.go:12: c.Param undefined (type *gin.Context has no field or method Param)
# cat main.go
package main

import (
        "github.com/gin-gonic/gin"
        "net/http"
)

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

        router.GET("/user/:name", func(c *gin.Context) {
            name := c.Param("name")
            c.String(http.StatusOK, "Hello %s", name)
        })

        router.Run(":8080")
}

Но когда я не вызываю функцию param вот так, Gin выглядит работающим.

# cat main.go
package main

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

func main() {
        r := gin.Default()
        r.GET("/ping", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "message": "pong",
            })
        })
        r.Run(":8080")
}
# go run main.go
[GIN-debug] GET   /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080
[GIN] 2016/08/17 - 03:01:17 | 200 |     79.238µs | [::1]:41546 |   GET     /ping

Main.go находится там же.

person k16    schedule 17.08.2016
comment
путь /go/myproject/src/server/main.go в порядке, в чем ошибка? - person ; 17.08.2016
comment
Спасибо. хммм, ошибка означает, что c.Param undefined (тип * gin.Context не имеет поля или метода Param). - person k16; 17.08.2016
comment
main.go единственный файл внутри /go/myproject/src/s‌​erver/ или есть другой *.go файл внутри /go/myproject/src/s‌​erver/? - person ; 17.08.2016
comment
Да, я поместил дополнительную информацию в эту форму, которая ниже добавлена2. Собственно у меня только main.go. - person k16; 17.08.2016
comment
Что внутри vendor, попробуйте удалить все файлы и vendor каталог, кроме main.go, затем go build, это нормально? в таком случае проблема - поставщик. - person ; 17.08.2016
comment
Круто, работает. ты прав. Спасибо. Каталог vendor создается Glide. Я хотел управлять пакетами в моем проекте, поэтому я попытался использовать Glide. Наверное, Джин не умеет сам читать пакеты, скачанные Glide ??? хммм, у меня другая проблема. ржу не могу. Я попробую использовать другой пакетный менеджер. в любом случае спасибо за вашу огромную помощь @Amd. - person k16; 17.08.2016

Получил такую ​​же проблему. Glide теперь пытается использовать семантическое управление версиями 2.0.0, которое давно не обновлялось, установка версии вручную на последнюю разработку устраняет проблему:

- package: github.com/gin-gonic/gin
  version: f931d1ea80ae95a6fc739213cdd9399bd2967fb6
person nxvl    schedule 31.08.2016

Я столкнулся с той же проблемой.
Я не уверен в основной причине, но исправил ее, изменив код с

c.Param("name")

to

c.Params.ByName("name")

Если вы посмотрите на исходный код метода Param(), то это то, что он называл под прикрытием.

person Athir Nuaimi    schedule 27.09.2016
comment
Нет, это не ответ, и это еще одна проблема, смотрите все комментарии под всеми сообщениями. c.Param(key) - это ярлык для c.Params.ByName(key), см. Param(key) документы. И обновите свой пакет: github.com/gin-gonic/gin - person ; 27.09.2016
comment
согласен, основная причина заключалась в использовании старой версии кода gin-gonic. Обновился до последней версии, и проблема исчезла. - person Athir Nuaimi; 28.09.2016