【问题标题】:how do i import packages in go-lang or how to structure correctly package structure?如何在 go-lang 中导入包或如何正确构建包结构?
【发布时间】:2021-03-20 09:27:04
【问题描述】:

我这里有以下文件夹结构

   server
       -main.go
     -cmd
         -config
           -config.go    
           -handlerr.go   
     -handlers
           -handlers.go         
     -pkg 
         -models       
           -models.go  
           -db       
             -db.go
     -router
           -router.go

当我尝试将“模型包”导入 db 包时,它显示“无效的导入路径:...”,我正在遵循此结构,所以我做错了什么?如何导入模型转换为数据库函数还是我应该替换它们(数据库和模型),有什么建议吗? enter image description here

【问题讨论】:

标签: go import package backend golang-migrate


【解决方案1】:

这里是问题中填写的文件。说明了从 db 到模型的导入。我将模块名称设置为“my.example”。更改该名称以满足您的需求。最好选择包括“。”的内容。以避免与标准包冲突。你可以run this code on the Go PlayGroundHow to Write Go Code 详细解释了所有这些内容。

-- main.go--

package main

import (
    "my.example/pkg/models/db"
)

func main() {
    db.Hello()
}

-- go.mod--

module my.example

-- cmd/config/config.go--

package config

-- cmd/config/handlerr.go--

package config

-- handlers/handlers.go--

package handlers

-- pkg/models/models.go--

package models

func Hello() string { return "hello from models" }

-- pkg/models/db/db.go--

package db

import (
    "fmt"

    "my.example/pkg/models"
)

func Hello() {
    fmt.Println("hello from db and", models.Hello())
}

-- pkg/router/router.go--

package router

关于文件的布局:这是在意见的土地上,所以我只是问你一个问题。 pkgcmd 中的额外嵌套级别对您有什么好处吗?

【讨论】:

  • 我正在关注一本书,所以在那本书中他使用了这种结构,所以简单来说 cmd 文件夹是用于我的功能的,它将与数据库和模板交互,并且在 pkg 中我有可以重复使用的东西稍后,在另一个项目上,例如:cmd app
【解决方案2】:

更新: 正如@maxm 提醒我的那样,使用GOPATHhere 就是一个很好的例子,他提到了。

所以,如果我的网络搜索和一个小示例程序是正确的,这就是这里发生的事情。

Golang 将 本地包 视为带有 .go 文件的文件夹,实践中 /modules/module.go 如果 modules.go 在第一行有 package modules

所以,当我们包含一个本地包时,我们实际上是包含一个文件夹。我创建了一个小例子:

/project
      main.go
      /modules
          modules.go
          /printer
              printer.go

main.go

package main

import (
    "./modules/printer"
)

func main() {
    printer.Print()
}

modules/modules.go

package modules

import (
    "fmt"
)

func Modules() {
    fmt.Println("Modules Package")
}

模块/打印机/printer.go

package printer

import (
    "../../modules"
)

func Print() {
    modules.Modules()
}

这确实有效!所以,你可以导入一个父模块,你只需要包含文件夹

当然,我们不能有导入周期,Golang 不允许,如果你有这种错误,最好改变你的程序结构。

我不是在谈论路径和东西,这只是一个实用的解决方案。所以,聪明的人,请纠正我!

【讨论】:

猜你喜欢
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 2013-08-17
  • 1970-01-01
  • 2016-01-19
  • 2011-08-12
  • 1970-01-01
相关资源
最近更新 更多