问题标签 [go-toolchain]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
go - 为什么“运行”命令无法在主包中找到第二个文件?
我遇到了go run main.go
产生错误的问题:
但是,这些命令go build && ./goruntest
可以很好地编译和运行程序。
输出是:
来自 test()
你好来自sameFileTest()
来自 pkgtest.Test()
来自 pkgtest.Test1()
我的目录设置如下:
这是代码。
main.go
gotest1.go
pkgtest/pkgtest.go
pkgtest/pkgtest1.go
我知道问题是第二个文件是其中的一部分,package main
而且我也知道没有真正的理由在main
.
我的问题是:为什么go run
无法处理此设置,但构建和运行可执行文件却可以正常工作?
编辑
包含第二个文件pkgtest
我也知道该命令go run main.go gotest1.go
有效,但为什么我需要指定gotest1.go
?
为了简洁起见,我最初省略了这些细节。但现在我看到它们对这个问题很重要。
go - 有没有办法在 Go 程序中复制和恢复调用堆栈?
我正在尝试在 Go 程序中实现无限范围的延续(对于那些好奇的人,我正在编写一个方案解释器)。一种方法是将调用堆栈复制到堆中,以便以后可以恢复。Go 的垃圾收集器仍然需要知道堆栈副本中的所有指针。有没有办法在 Go 程序中做到这一点?请注意,如果需要,我愿意用 C 或汇编编写代码,与 Go 工具链兼容。
go - 如何使用 go get 安装软件包?
我想从 github 安装包到我的$GOPATH
,我试过这个:
存储库在这里。
go - 去 bin - 只有 3 个文件
我在 Windows 上安装了 Go 1.6.2,但在我的bin
目录中我现在只有 3 个文件:
我想知道这是正常的还是我的安装不太顺利。
pointers - Go vet 告诉我我在复制锁,而我认为我不是
您可以在以下位置找到我正在处理的代码:https ://github.com/bigblind/marvin
gometalinter从go vet给我以下错误:
accounts/interactors/accounts_test.go:16::error: 文字从 ma 复制锁定值:github.com/bigblind/marvin/accounts.MockAccountStore 包含 github.com/bigblind/marvin/vendor/github.com/stretchr/testify/ mock.Mock 包含 sync.Mutex(兽医)
如果您不熟悉 gometalinter,那没关系,它只是运行其他工具,包括 go vet。
因此,这是accounts/interactors/accounts_test.go:16
上下文周围行的代码:
第 16 行是上面代码片段的最后一行。我们正在获取accounts.NewMockAccountStore() and putting it in the first field of a new
CreateAccount` 结构的结果。
这是 MockAccountStore 的样子:
正如你在这里看到的,我经常使用指针。NewMockAccountStore
返回指向 的指针MockAccountStore
,并且MockAccountStore
包含指向 a 的指针mock.Mock
。
所以当我把这个新创建的东西MockAccountStore
放在我的CreateAccount
结构中时,我希望它基本上只是将指针分配给那个字段,而不复制任何东西。
最后,让我们看一下CreateAccount
结构:
所以CreateAccount
只有一个字段用于存储domain.AccountStore
. domain.AccountStore
是一个接口,它MockAccountStore
实现。
我能想出的唯一解释是分配给具有接口类型的字段以某种方式导致复制,但我不确定为什么,因为据我所知,接口值只是指向底层的指针类型。
谁能向我解释为什么去兽医抱怨?
看来我不是真的抄袭。
我已将代码更改如下:
当包含此代码的测试运行时,我收到以下恐慌消息:
初始 &accounts.MockAccountStore{Mock:(*mock.Mock)(0xc420019780)} 分配:&accounts.MockAccountStore{Mock:(*mock.Mock)(0xc420019780)}
如您所见,两个值都指向同一个mock.Mock
指针(0xc420019780)。
那我该怎么说go vet
呢?
应@putu 的要求,以下是命令输出accounts/interactors
:
bash - 执行 bash 脚本的变量中的 makefile 变量
我有一个makefile
我想在 linux (debian/Ubuntu) 和 Windows/Cygwin 上运行的。
我需要根据运行环境做一些稍微不同的事情,我得到了以下代码,它应该在变量中存储一个字符串,foo
如果操作系统是 linux,否则foo.exe
:
然后我想在另一个变量中使用该变量,例如:
前一个有/没有评估通过$(...some stuff...)
(见下文我为完成这项工作所做的所有测试)
最后,我想在任务中的其他地方“运行”该命令makefile
,例如:
我尝试了许多不同的组合
- 有/无
$(some stuff here)
, - 带/不带单引号
'
, - 带/不带 bash "`"
- 带/不带包装
bash -c '...some commands here...'
但我收到各种 bash 错误,例如:
invalid option -- 'c'
go
编译器抱怨此消息为EXECUTABLE_FILENAME
空:flag needs an argument: -o
- 无声地忽略
$(GODEPBUILD)
(我相信因为它以某种方式计算为一个空命令)
我正在执行这一系列步骤,因为我需要将go
工具链的许多命令包装到另一个名为godep
. 我go
在开头定义了工具链的许多不同“命令”,makefile
例如:
makefile
我在任务中调用这些“命令” $(GODEP_VERSION)
(或者-$(GODEP_VERSION)
如果我需要忽略stderr
),对我来说,以类似的方式添加“构建命令”是件好事。
make
版本是:
- 4.1 在 Ubuntu 上
- 4.2.1 在 Cygwin 上
这件事有可能吗?
我怎样才能实现不同“小脚本”的这种组合来构建make
应该在任务中运行的最终命令?
go - goimports 需要忽略供应商包
我正在尝试dep
在我的项目中实施。这一切都很好,但它也添加了一个供应商目录。我现在需要更新我的工具以忽略此目录,否则我的供应商包将被修改,或者我收到错误的警告。我目前正在使用以下工具:
- 去进口 -w
- 去看兽医
- 去皮棉
这些工具也用于 CI。我确实想继续使用 goimports 进行自动格式化,但我愿意开始使用 gometalinter。我并不是真的在寻找使用 grep 的解决方案并找到魔法。
我怎样才能让这些工具忽略vendor/
?
go - 单元测试不涵盖本地导入的包
我是 golang 的新手,并试图了解如何使这种情况发挥作用?
这是我的结构 GOPATH 设置为 /Users/xyz/project
我有一个主要的 go 文件,它导入“计算器”,它是一个本地包。当我跑步时
它只提供 main 的覆盖范围,但不包括 main 导入的包“calculator”。我知道我可以在计算器内编写一个测试,这可以解决问题,但是有没有办法从 main 获取本地导入包的覆盖范围?
更大的上下文 - 我想这样做的原因是因为我有一个使用 gin 框架用 go 编写的微服务,我想将它作为服务启动并进行 http 调用并进一步查看覆盖范围(如组件测试) . 我可以通过编写启动服务的 main_test go 文件轻松启动它,但我没有得到导入包的覆盖范围。
git - 在推送到远程版本控制之前检查以确保项目编译
我有一个用于 TypeScript 项目的脚本,可确保我的代码在我将其推送到远程之前编译:
当我在一天结束时或在拉取请求之前将代码推送到我的功能分支时,该脚本工作得非常好——它有助于防止不必要的提交,但也使它变得容易。
使用 Go,我只想在将 go 项目推送到远程之前检查所有内容是否编译。
Go build 是检查整个项目编译的最佳选择,还是查找所有 go 包并编译每个包的更通用方法?我想对于有多个未链接在一起的包的项目,那么您将不得不遍历每个包并分别编译它们?