相关疑难解决方法(0)

组织一个多文件Go项目

注意:这个问题涉及到这一块,但两年是围棋历史很长一段时间.

在开发过程中组织Go项目的标准方法是什么?

我的项目是一个单独的包mypack,所以我想我把所有.go文件放在一个mypack目录中.

但是,我想在开发过程中测试它,所以我至少需要一个声明main包的文件,这样我才能做到go run trypack.go

我该如何组织这个?go install mypack每次我想尝试时都需要做吗?

go

233
推荐指数
7
解决办法
11万
查看次数

Golang如何在没有gopath的情况下导入本地包?

我已经习惯GOPATH但是对于这个当前的问题,我面临的并没有帮助.我希望能够创建特定于项目的包:

myproject/
??? binary1.go
??? binary2.go
??? package1.go
??? package2.go
Run Code Online (Sandbox Code Playgroud)

我试过多种方法,但我如何才能package1.go在工作binary1.gobinary2.go等等?

例如; 我希望能够import "package1",然后能够运行go build binary1.go,一切正常,没有错误被抛出,无法找到包GOROOTGOPATH.我需要这种功能的原因是大型项目; 我不想引用多个其他包或将它们保存在一个大文件中.

package go

145
推荐指数
7
解决办法
19万
查看次数

导入同一文件夹中的go文件

我很难将本地go文件导入另一个go文件.

我的项目结构如下所示

-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin
Run Code Online (Sandbox Code Playgroud)

我想在b.go里面输入a.go. 我试过以下,

import "a"
import "github.com/xxxx/a"
Run Code Online (Sandbox Code Playgroud)

这些都没有奏效.我明白我必须干涉GOPATH,但我无法做到.目前我的GOPATH指向samplego(/ workspace/samplego).我得到以下错误

cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)
Run Code Online (Sandbox Code Playgroud)

另外,当这些源文件导入另一个项目/模块时,GOPATH如何工作?那么当地的进口是一个问题吗?在这种情况下,最佳做法是什么 - 它是否只在模块中有一个go文件(带有相关的测试)?

import path go

66
推荐指数
4
解决办法
7万
查看次数

访问go模块中的本地包(转1.11)

我正在尝试Go的新模块系统,并且无法访问本地软件包.以下项目位于我的gopath外部桌面上的文件夹中.

我的项目结构如下:

/
  - /platform
      - platform.go
  - main.go
  - go.mod
Run Code Online (Sandbox Code Playgroud)
// platform.go
package platform

import "fmt"

func Print() {
    fmt.Println("Hi")
}
Run Code Online (Sandbox Code Playgroud)
// main.go
package main

import "platform"

func main() {
    platform.Print()
}
Run Code Online (Sandbox Code Playgroud)

go build main.go 告诉我

cannot find module for path platform
Run Code Online (Sandbox Code Playgroud)

go vgo

40
推荐指数
3
解决办法
2万
查看次数

模块化代码如何在Go中运行?

不是来自C /编译语言背景,我发现很难掌握使用Go的包机制来创建模块化代码.

在Python中,要导入模块并访问它的函数等等,这是一个简单的例子

import foo
Run Code Online (Sandbox Code Playgroud)

其中foo.py是要在同一目录中导入的模块的名称.否则,您可以__init__.py在子文件夹中添加一个空格并通过它访问模块

from subfolder import foo
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过模块名称简单地引用它们来访问函数,例如y = foo.bar(y).这使得将逻辑代码片段彼此分离变得容易.


但是,在Go中,您可以在源文件本身中指定包名称,例如

package foo
Run Code Online (Sandbox Code Playgroud)

在'foo'模块的顶部,然后您可以通过该模块导入

import (
        "foo"
              )
Run Code Online (Sandbox Code Playgroud)

然后通过它来引用它,即y := foo.Bar(x).但是我无法理解的是这在实践中是如何运作的.golang.org上的相关文档似乎很简洁,并且针对使用makefile和编译器的更多(任何)经验的人.

有人可以清楚地解释你是如何在Go中模块化你的代码,正确的项目结构,以及编译过程如何工作?

module packages projects-and-solutions compilation go

11
推荐指数
1
解决办法
9553
查看次数

在本地将子包与go mod一起使用

我在文件系统上(不在中$GOPATH)有一个go包,名为bitbucket.org/me/awesome

~/awesome> tree
.
??? main.go
??? go.mod
??? go.sum
??? subpackageA
?   ??? main.go
Run Code Online (Sandbox Code Playgroud)

我的go.mod样子是:

module bitbucket.org/me/awesome

require (
       ... # lots of external dependencies
)

replace bitbucket.org/me/awesome => ./
Run Code Online (Sandbox Code Playgroud)

main.go顶层目录中,我调用一个子包,如下所示:

import "bitbucket.org/me/awesome/subpackageA"
Run Code Online (Sandbox Code Playgroud)

这一切似乎都很正常。go get作品。但是,当我将整个存储库克隆到其他位置(例如在Docker映像中)并go get首次运行时,出现如下错误:

package bitbucket.org/me/awesome/subpackageA: https://api.bitbucket.org/2.0/repositories/me/awesome?fields=scm: 403 Forbidden

这意味着它没有使用软件包的本地文件系统版本,即使我通过文件中的replace指令告诉了它go.mod

我究竟做错了什么?如何确保从文件系统使用子包,而不是尝试从Internet提取子包?

go dependency-management go-modules

7
推荐指数
1
解决办法
3426
查看次数

具有多个模块的单存储库中的 Go 模块名称是否有约定?

在多模块存储库中,模块名称(通过 go.modmodule指令设置)是否应该遵循包命名约定?

例如 module github.com/org-name/repo-name/path/to/module-dir

我明白,无论模块的名称如何,模块中的包都使用模块名称作为前缀相互引用。但是,从模块外部来看,如果模块名称设置为<host><path-within-repo>模式以外的其他内容,则似乎存在问题。get-ing 包含在模块中的包然后给出关于unrecognized import path.

是否有任何原因以不同的方式命名模块<host><path-within-repo>

go go-modules

5
推荐指数
1
解决办法
4069
查看次数

go 模块多个主要方法

我有一个具有多种主要方法的项目。当运行go build program1/main1.go具有与 不同的依赖项集时program2/main2.go,我的第一个go build似乎更改了我的go.mod文件并删除了它认为不需要的依赖项。然而main2会需要这些依赖。

我试过使用,go build ...但这也创建了一组不同的依赖项。具体来说,似乎所有//indirect依赖项都被删除并导致 program2 失败。

有没有办法运行go buildgo run不更新go.mod文件?使用go build -mod=readonly program1/main1.go它告诉我它失败了,因为需要更新依赖项..

go go-modules

3
推荐指数
1
解决办法
1624
查看次数

同一项目中的多个模块

我一直在使用Go模块,但我想知道以下目录结构的最佳实践是什么:

project
??? go.mod
??? main.go
??? players
    ??? go.mod
    ??? players.go
    ??? players_test.go
Run Code Online (Sandbox Code Playgroud)

起初我在将players软件包导入到根项目时遇到问题,但是我注意到我可以在根go.mod文件中执行此操作

module github.com/<name>/<project>

require (
    github.com/<name>/players v0.0.0
)

replace github.com/<name>/players => ./players
Run Code Online (Sandbox Code Playgroud)

然后,这允许我import "github.com/<name>/players"main.go文件中执行操作。

现在,此方法可行并从此处采用,但是我不确定这是否是正确的方法,或者该方法是否仅用于在版本控制之外临时更新本地包。

另一个选择,似乎有点过大,是使每个模块都有自己的存储库?

TL; DR; -在同一存储库中包含多个模块并将其导入其他模块/根main.go文件中的最佳实践方法是什么?

module go

1
推荐指数
3
解决办法
909
查看次数

我可以在一个 go 模块中包含多个包吗?如何?

我有一个名为“tatata”的 Go 模块。它仅在我的机器上开发,因此它不包含模块名称中任何 URL 的任何路径。

如果main我的模块中只有一个包,它可以正常工作。但是,如果我在模块中创建两个包,就会遇到一些问题。

这是树:

./|
  |- go.mod
  |-src
     |- main
     |   | - main.go
     |
     |- api
         | - api.go

Run Code Online (Sandbox Code Playgroud)

文件内容:

go.mod

module tatata

go 1.13
Run Code Online (Sandbox Code Playgroud)

main.go

package main

import "fmt"
import "tatata/api"

func main() {
  fmt.Println("Hello world")
  api.Test1()
}
Run Code Online (Sandbox Code Playgroud)

api.go

package api

import "fmt"
func Test1() {
   fmt.Println("Testing API")
}
Run Code Online (Sandbox Code Playgroud)

当我尝试构建时,我发出go build ./src/main并收到以下错误: build tatata/src/main: cannot load tatata/api: malformed module path "tatata/api": missing dot in first path element

现在,如果我尝试放置一个虚拟点,例如将模块重命名为tatata.com我会收到错误,build …

go go-modules

-1
推荐指数
1
解决办法
4942
查看次数