标签: go-toolchain

Go 文件未运行且不在主包中

我有一个非常简单的 Go 项目设置。在根目录中,我有go.mod文件和main.go一个名为main2. 文件夹里面main2main2.go文件。

/
|_ go.mod
|_ main.go
|_ main2
   |_ main2.go
Run Code Online (Sandbox Code Playgroud)

从根目录我尝试运行 go run 命令

go run main2/main2.go
Run Code Online (Sandbox Code Playgroud)

它会抛出错误:

包命令行参数不是主包

有人可以帮忙吗?

program-entry-point go go-toolchain

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

为什么"go run"命令无法在主包中找到第二个文件?

我遇到了go run main.go产生错误的问题:

# command-line-arguments
./main.go:9: undefined: test
Run Code Online (Sandbox Code Playgroud)

但是命令go build && ./goruntest编译并运行程序就好了.

输出是:

嗨来自test()

嗨,来自sameFileTest()

您好,来自pkgtest.Test()

您好,来自pkgtest.Test1()

我有这样的目录设置:

go/src/github.com/username/goruntest/
    pkgtest/
        pkgtest.go
        pkgtest1.go
    main.go
    test2.go
Run Code Online (Sandbox Code Playgroud)

这是代码.

main.go

package main

import (
    "fmt"
    "github.com/username/goruntest/pkgtest"
)

func main() {
    fmt.Println(test())           // main.go:9
    fmt.Println(sameFileTest())
    fmt.Println(pkgtest.Test())
    fmt.Println(pkgtest.Test1())
}

func sameFileTest() string {
    return "Hi from sameFileTest()"
}
Run Code Online (Sandbox Code Playgroud)

gotest1.go

package main

func test() string {
    return "Hi from test()"
}
Run Code Online (Sandbox Code Playgroud)

pkgtest/pkgtest.go

package pkgtest

func Test() string {
    return "Hi from pkgtest.Test()"
} …
Run Code Online (Sandbox Code Playgroud)

package go go-toolchain

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

调用go工具的编程方式

有没有办法go build通过库调用从另一个 Go 程序中以编程方式调用 Go 工具(如 ),并获得与命令行调用的文本输出相比更结构化的输出?

go go-toolchain

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

使用“go list”如何仅列出二进制文件中使用的Go模块?

我想列出在最终可执行文件(而不是其他依赖项)中编译的模块(及其版本)。

我可以这样做:

$ go build -o a.out
$ go version -m a.out
Run Code Online (Sandbox Code Playgroud)

但是我怎样才能做到这一点go list(它有一个方便的 JSON 输出)?

我试过这个:

$ go list -m -f '{{define "M"}}{{.Path}}@{{.Version}}{{end}}{{if not .Main}}{{if .Replace}}{{template "M" .Replace}}{{else}}{{template "M" .}}{{end}}{{end}}' all
Run Code Online (Sandbox Code Playgroud)

但它列出了许多传递依赖项,这些依赖项仅在测试套件中使用。我不知道如何过滤掉这些依赖项。

这是一个查看问题的示例项目(可在 Go Playground 上找到):

main.go:

$ go build -o a.out
$ go version -m a.out
Run Code Online (Sandbox Code Playgroud)

main_test.go:

$ go list -m -f '{{define "M"}}{{.Path}}@{{.Version}}{{end}}{{if not .Main}}{{if .Replace}}{{template "M" .Replace}}{{else}}{{template "M" .}}{{end}}{{end}}' all
Run Code Online (Sandbox Code Playgroud)

go.mod:

module play.ground

go 1.15

require github.com/google/go-cmp v0.5.2
Run Code Online (Sandbox Code Playgroud)
$ …
Run Code Online (Sandbox Code Playgroud)

go go-toolchain go-modules

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

如何使用 go/analysis 查找 Ident 的声明?

我使用 go/analysis 创建自己的静态分析工具。我仍然不知道如何从ast.Ident中找到def信息。

这是我的测试数据

package randomcheck
func xxx() {
}
func demo()  {
    xxx()
}

Run Code Online (Sandbox Code Playgroud)

还有我自己的分析仪

import (
    "fmt"
    "go/ast"
    "golang.org/x/tools/go/analysis"
    "golang.org/x/tools/go/analysis/passes/inspect"
)

var name string // -name flag
var Analyzer = &analysis.Analyzer{
    Name:     "fft",
    Requires: []*analysis.Analyzer{inspect.Analyzer},
    Run:      run,
}
//pass.Fset.Position(name.Pos())
func run(pass *analysis.Pass) (interface{}, error) {
    for _, f := range pass.Files {
        ast.Inspect(f, func(node ast.Node) bool {
            name,ok := node.(*ast.Ident)
            if !ok {
                return true
            }
            if name == nil {
                return true
            }
            if pass.TypesInfo.Defs[name] != nil …
Run Code Online (Sandbox Code Playgroud)

static-analysis abstract-syntax-tree go go-toolchain

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

goimports需要忽略供应商软件包

我正在尝试dep在我的项目中实施。这一切都很好,但是它还添加了一个供应商目录。现在,我需要更新工具以忽略此目录,否则我的供应商软件包将被修改,或者得到警告的误报。我目前正在使用以下工具:

  • goimports -w
  • 去兽医
  • 皮棉

这些工具也用于CI。我确实想继续使用goimports进行自动格式化,但是我愿意开始使用gometalinter。我不是真的在寻找使用grep的解决方案并找到魔术。

如何使这些工具被忽略vendor/

continuous-integration go go-toolchain

4
推荐指数
1
解决办法
2038
查看次数