【问题标题】:Fully-qualified import path in auto-generated code自动生成代码中的完全限定导入路径
【发布时间】:2017-12-02 23:10:32
【问题描述】:

我的问题

如果问题微不足道,我深表歉意 - 我对 golang 还很陌生,想了解导入机制。我使用 OSX 和简单的 go 程序编译和运行良好。

我在swagger editor 中使用automatic code generator 生成了一个golang 服务器。我已将代码解压缩到/tmp/ 的某个目录中,生成的服务器包含以下main.go 文件:

package main

import (
        // WARNING!
        // Change this to a fully-qualified import path
        // once you place this file into your project.
        // For example,
        //
        //    sw "github.com/myname/myrepo/go"
        //
        sw "./go"
        "log"
        "net/http"
)

func main() {
        log.Printf("Server started")

        router := sw.NewRouter()

        log.Fatal(http.ListenAndServe(":8080", router))
}

正如 cmets 所期望的那样,go build main.go 失败并出现以下错误:

main.go:11:2:
go/default.go:3:1: expected 'IDENT', found 'import'

取证

项目的目录树

/tmp/goserver/go-server-server
├── LICENSE
├── api
│   └── swagger.yaml
├── go
│   ├── README.md
│   ├── app.yaml
│   ├── default.go
│   ├── logger.go
│   └── routers.go
└── main.go

go/default.go

package

import (
    "net/http"
)

type Default struct {

}

func QuestionimagePost(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json; charset=UTF-8")
        w.WriteHeader(http.StatusOK)
}

我尝试了什么

  • 阅读go packages
  • 试图了解一些github项目中的包/导入关系
  • 将目录树移至$GOPATH/src,并将导入更改为sw "sw/go-server-server/go",仍为main.go:13:2: go/default.go:3:1: expected 'IDENT', found 'import'

sw 导入的完全限定导入路径应该是什么,它的含义是什么?

【问题讨论】:

  • 永远不要尝试使用相对导入路径(除了一次性示例)。导入很简单,就是从$GOPATH/src/到模块的路径
  • 那我该怎么办?复制文件夹$GOPATH/src/?
  • 该错误看起来像您在名为 default.go 的 go 目录中有一个文件存在语法错误。
  • @reedobrien 谢谢,添加了文件的内容。是缺少包名的问题吗?它与目录名称有关吗? golang.org/doc/code.html#PackageNames
  • 通常使用文件所在目录的名称作为包的名称。但是使用package go 似乎很混乱。 main 是一个特殊的包名,用来表示包中有一个 main 函数被编译成可执行的二进制文件。

标签: go import swagger swagger-codegen


【解决方案1】:

以下方法成功了:

  • 为go文件夹中的所有.go文件添加包名(我用blah

例如。在 go/routers.go 中

package blah

import (
    "log"
    "net/http"
    "time"
)

func Logger(inner http.Handler, name string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()

        inner.ServeHTTP(w, r)

        log.Printf(
            "%s %s %s %s",
            r.Method,
            r.RequestURI,
            name,
            time.Since(start),
        )
    })
}

go/logger.go 执行相同操作,在您的情况下为default.go

  • 在出现go/routers.go:7:2: cannot find package "github.com/gorilla/mux" 错误后,go get 'github.com/gorilla/mux'

【讨论】:

  • 你能详细说明一下“添加包名”是什么意思吗?
  • @JHowIX 我编辑了答案以显示对我有用的方法。我认为他的意思是为 go 文件夹中的所有 .go 文件添加一个包名。
  • 即routers.go、logger.go 和 default.go
【解决方案2】:

您需要将一些路径导出为GOPATH,例如$HOME/goexport GOPATH=$HOME/go

然后您可以将您的项目放在$GOPATH/src/go-server-server ($HOME/go/src/go-server-server) 中,如果我没看错的话,您的完全合格路径将是go-server-server/go

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 2020-05-05
    • 2011-03-21
    • 1970-01-01
    • 2022-01-01
    • 2011-12-29
    • 1970-01-01
    • 2011-05-14
    相关资源
    最近更新 更多