4

GolangのフレームワークであるGinを使ってみました。
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)
4

5 に答える 5

2

編集:OPには、古いバージョンのパッケージを含む「Glideによって作成されたvendor dir」がありました。そのフォルダーを削除することで問題が解決しました(ベンダーパッケージの更新)。

: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.gogo 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
于 2016-08-16T09:07:41.563 に答える
0

私はこれを機能させましたが、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てきます。

あなたのエラーは './main.go:19: c.Param undefined' に従って gin.go の 19 行目にあったようです。スクリプトの他の行は何ですか?

提供されたスクリプトの長さはわずか 14 行です。

于 2016-08-16T08:49:16.897 に答える
0

成功しました。

その理由は、私のディレクトリの深さです。main.go を "/go/myproject/src/server/main.go" に置き、"export GOPATH=/go/myproject" を設定します。

この場合、エラーが発生しました。しかし、「/go/myproject/src/main.go」で 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 は同じ場所に設定されています。

于 2016-08-17T01:20:58.937 に答える