【问题标题】:Structuring local imports without GitHub in Golang在 Golang 中构建没有 GitHub 的本地导入
【发布时间】:2021-11-02 16:57:37
【问题描述】:

我正在构建一个简单的应用程序,在阅读了有关构建 go 应用程序的文档后,我仍然感到困惑。

我想要这个结构:

  • 练习
    • 模型(打包为模型)
      • 一个
      • b
    • 路由器(打包成路由器)
      • 一个
      • b

app.go

在app.go 内部,我有以下内容:

package main

import (
    "net/http"

    // I have tried the following:
    "practice/models/a"
    "practice/models/b"
    "practice/models"
    "$GOPATH/practice/models/a"
    "$GOPATH/practice/models/b"
    "$GOPATH/practice/models"
    ...
)

func main() {
    http.HandleFunc("/a", AHandler)
    http.HandleFunc("/b", BHandler)
    http.ListenAndServe(":8080", nil)
}

A 和 B 模型如下所示:

package models

import "net/http"

func AHandler(w http.ResponseWriter, r *http.Request) {
   // code
}

两个问题:

  1. 究竟什么是导入这些文件的正确方法?我真的必须将它们推送到 github 才能引用它们吗?我知道 $GOPATH 是本地机器上整个 go 工作区的命名空间。我的 $GOPATH 设置为包含此目录。

  2. 我需要在这些文件中定义一个 main 方法吗?我可以只导出一个函数并将其作为处理函数吗?

我咨询了docs

【问题讨论】:

    标签: go


    【解决方案1】:

    见How to Write Go Code。

    使用这个目录结构:

    - practice
        - go.mod
        - app.go
        - models 
           - a.go
           - b.go
        - routers 
           - a.go
           - b.go
    

    其中 go.mod 是使用命令 go mod init practice 创建的,其中 practice 是模块路径。

    如下导入包:

    import (
      "practice/routers"
      "practice/models"
      ...
    )
    

    像这样使用导入的包:

    func main() {
      http.HandleFunc("/a", models.AHandler)
      http.HandleFunc("/b", models.BHandler)
      http.ListenAndServe(":8080", nil)
    }
    

    即使在模块路径中使用github.com,也无需推送到github.com。

    main 包中的 main 函数是应用程序的入口点。不要在 main 以外的包中定义 main 函数。


    以下是基于 GOPATH 工作空间的原始答案:

    见How to Write Go Code。

    在 $GOPATH/src 下创建你的目录结构。

    • $GOPATH
      • 源
        • 练习
          • 型号
          • 路由器

    如下导入包:

    import (
      "practice/routers"
      "practice/models"
      ...
    )
    

    像这样使用导入的包:

    func main() {
      http.HandleFunc("/a", models.AHandler)
      http.HandleFunc("/b", models.BHandler)
      http.ListenAndServe(":8080", nil)
    }
    

    你不需要推送到 github.com,即使你在文件路径中使用 'github.com'。

    main 包中的 main 函数是应用程序的入口点。不要在 main 以外的包中定义 main 函数。

    【讨论】:

    • 例如,如何从practice/routers/a 中引用附加到main 包(因此在顶部带有package main 的文件中)的某些东西(例如结构)?
    • @ByronCoetsee 因为 Go 不允许循环依赖,所以无法从其他包中引用主包中声明的类型。
    【解决方案2】:

    我认为其他答案已过时,您不再需要使用GOPATH。 运行:

    go mod init yellow
    

    然后创建一个文件yellow.go:

    package yellow
    
    func Mix(s string) string {
       return s + "Yellow"
    }
    

    然后创建一个文件orange/orange.go:

    package main
    import "yellow"
    
    func main() {
       s := yellow.Mix("Red")
       println(s)
    }
    

    然后构建:

    go build
    

    https://golang.org/doc/code.html

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 2020-09-12
      • 2022-01-08
      • 1970-01-01
      • 2021-06-23
      • 2015-08-20
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多