为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 的主包外导入我自己定义的函数?

如何在 Go 的主包外导入我自己定义的函数?

Go
POPMUISE 2021-12-07 15:15:10
我对 Go 很陌生,但我来自 C++ 学校。我只想制作一个项目并将逻辑拆分为多个文件。在 C++ 中,我只需要穿上我main_file.cpp的单曲#include "my_own_lib.hpp" (类似于module.exports然后require('relative/path/to/my-own-lib')在 Node.js 中)就是这样。在围棋中,我遵循了相同的逻辑,但我的结果是:$ go run main.gomain.go:4:8: open /Users/mt/Documents/Codes/go/src/github.com/mt/Apollo/tst: no such file or directory我的文件:main.gopackage mainimport "fmt"import "./tst"func main() {    fmt.Println("just testing")    tst.p()}tst.gopackage tstimport "fmt"func p() {    fmt.Println("ola")}当然我的文件结构是:myFolder/   |- main.go   |_ tst.go有人能告诉我这样做的正确方法是什么吗?
查看完整描述

2 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

如果您将 tst.go 的包也设置为“package main”,您将能够在没有任何导入语句的情况下访问 p()。


$ cat main.go 

package main


func main() {

    p()

}

$ cat tst.go 

package main


import "fmt"


func p() {

    fmt.Println("ola")

}

$ go build ./ && ./test 

ola

我相信这将满足您的要求:


我只想制作一个项目并将逻辑拆分为许多不同的文件。


如果您正在构建一个程序而不是一个库,那么公认的 Go 约定是将您的所有文件都作为“package main”:


“main”包告诉 Go 编译器该包应该编译为可执行程序而不是共享库。 http://thenewstack.io/understanding-golang-packages/


请解释您的反对意见


下面是一些众所周知的惯用 Go 项目的例子,它们完全按照我说的做:


https://github.com/tools/godep

https://github.com/docker/containerd/tree/master/containerd

这些是代码拆分在多个 Go 文件中的可执行文件,所有这些文件都属于“package main”。


看到OP有点不清楚,你可以选择解释他想创建一个外部包tst。但他说的很清楚:


我只想制作一个项目并将逻辑拆分为许多不同的文件。


他说很多文件 -没有很多外部包。而且他还说:


当然我的文件结构是:


myFolder/

   |- main.go

   |_ tst.go

我的建议是在这种情况下做事的正确方法:


executable/

   |- main.go (package main)

   |- a.go (package main)

   |- b.go (package main)

将应用程序拆分为 main、a 和 b。


查看完整回答
反对 回复 2021-12-07
?
动漫人物

TA贡献1815条经验 获得超10个赞

如果我正确阅读了问题:


导入路径应该是完整路径,遵循 $GOPATH,所以可能是“github.com/mt/Apollo/tst”


这是包代码应该驻留的地方,也是包导入路径。从文档中看到这一点:


标准库中的包被赋予了短路径,例如“fmt”和“net/http”。对于您自己的包,您必须选择一个基本路径,该路径不太可能与标准库或其他外部库的未来添加发生冲突。


如果您将代码保存在某个源存储库中,那么您应该使用该源存储库的根目录作为您的基本路径。例如,如果您在 github.com/user 上有一个 GitHub 帐户,那应该是您的基本路径。


我有它的工作。这正是我所做的:


main.go


package main


import (

    "fmt"

    "github.com/mt/Apollo/tst"

)


func main() {

    fmt.Println("just testing")

    tst.P()

}

tst.go


package tst


import (

    "fmt"

)


func P() {

    fmt.Println("ola")

}

目录结构如下:


山/阿波罗/main.go


山/阿波罗/tst/tst.go


另一件要注意的事情是我将 func p() 中的“P”大写。不导出小写标识符。更多关于这里


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信