当前位置: 首页 > 面试题库 >

使用Go模块组织程序包中的本地代码

柏阳炎
2023-03-14
问题内容

main.go当在之外使用Go模块(go版本> = 1.11)时,找不到在本地包中分解出某些代码的方法$GOPATH

我没有导入任何需要包含在内的外部依赖项go.mod,我只是想在本地组织此Go模块的源代码。

文件main.go

package main

// this import does not work
import "./stuff"

func main() {
    stuff.PrintBaz()
}

该文件./stuff/bar.go(假装为本地软件包):

package stuff

import "log"

type Bar struct {
    Baz int
}

func PrintBaz() {
    baz := Bar{42}
    log.Printf("Bar struct: %v", baz)
}

文件go.mod(命令go mod init foo):

module foo

go 1.12

执行时go run main.go

  • 如果是我import "./stuff",那么我明白了build command-line-arguments: cannot find module for path _/home/<PATH_TO>/fooprj/stuff
  • 如果是我import "stuff",那么我明白了build command-line-arguments: cannot load stuff: cannot find module providing package stuff
  • 如果我import stuff "./stuff"使用软件包别名,那么我会再次看到:build command-line-arguments: cannot find module for path _/home/<PATH_TO>/fooprj/stuff

我找不到使本地软件包与go模块一起使用的方法。

  • 上面的代码有什么问题?
  • 如何在使用Go模块(文件go.mod定义的项目中将本地包导入其他Go代码?

问题答案:

首先,您必须为项目选择一个名称并将其写入go.mod文件。该名称属于项目的根目录。您创建的每个新软件包都必须位于其自己的子目录中,并且其名称应与目录名称匹配。

go.mod:

module myprojectname

或(首选方式,请参见下面的答案以获取详细信息)

module github.com/myname/myproject

然后导入项目的包,例如:

import myprojectname/stuff

要么

import github.com/myname/myproject/stuff

软件包文件stuff应位于项目stuff目录中。您可以根据需要命名这些文件。

也可以创建更深的项目结构。例如,您决定将源代码文件与其他文件分开(例如应用程序配置,docker文件,静态文件等)。让我们将stuff目录移到其中,里面的pkg每个go文件pkg/stuff仍然具有stuff包名。要导入东西包,只需编写:

import myprojectname/pkg/stuff

没有什么可以阻止您在层次结构中创建更多级别github.com/myuser/myproject/pkg/db/provider/postgresql,其中:

  • github.com/myuser/myproject - 项目名称。
  • postgresql - 包裹名字。
  • pkg/db/provider/postgresql -相对于项目根目录的软件包路径。

您可以在此处阅读有关go模块的更多信息:https :
//github.com/golang/go/wiki/Modules

查看该存储库,以获取有关项目组织中使用的各种模式的有用信息:https : //github.com/golang-standards/project-
layout
如果进入pkg目录,您将发现哪些开源项目pkg在其结构中使用目录。



 类似资料:
  • 问题内容: 我正在试用Go的新模块系统,无法访问本地软件包。以下项目位于我的gopath外的桌面上的文件夹中。 我的项目结构如下: 告诉我 问题答案: 我强烈建议您使用go工具链,它可以解决这些问题。带vscode-go插件的Visual Studio Code非常有用。 这里的问题是Go需要相对于您或import语句的相对路径。根据您所在的位置,导入路径也应包括该位置。在这种情况下,import

  • 利用代码块 一个 GCC 非常模糊的特性,以及 Clang 也有的特性是,代码块如果在闭合的圆括号内的话,会返回最后语句的值 NSURL *url = ({ NSString *urlString = [NSString stringWithFormat:@"%@/%@", baseURLString, endpoint]; [NSURL URLWithString:urlStri

  • 任何超过 1000 行的 CSS 代码,你都曾经历过这样的体验: 这个 class 到底是什么意思呢? 这个 class 在哪里被使用呢? 如果我创建一个 xxoo class,会造成冲突吗? Reasonable System for CSS Stylesheet Structure 的目标就是解决以上问题,它不是一个框架,而是通过规范,让你构建更健壮和可维护的 CSS 代码。 Componen

  • 我有1个应用程序和2个模块 框架结构 但我不能在MyApp中使用MyModule的文件。IDE显示我“无法访问”错误,我想扩展一个MyModule类的类。而且它不是从MyModule创建类的,有人对此有想法吗?怎么了?

  • 问题内容: 我有一个下载的模块库,我想在本地安装它,而不是在另一个目录中全局安装? 有什么简单的方法可以做到这一点? 问题答案: 您只需为提供一个参数,则该参数应指向本地文件夹而不是包名称:

  • 我正在尝试在docker文件上构建我的go应用程序。在我的内心深处。mod有一个需要身份验证/ssh的私有包。这个问题类似于在Docker中使用私有模块构建Go应用程序,但在我的情况下,我必须从而不是中提取包。这是我的dockerfile: 我试图按照这个教程https://divan.dev/posts/go_get_private/,通过更改到仍然失败。 以下是错误详细信息: 这里有人知道如何