我在Go上很新,但我来自C ++学校。我只是想制作一个项目并将逻辑分成多个文件。
在C ++中,我只需要将main_file.cpp
单个
#include "my_own_lib.hpp"
(类似于module.exports
,然后是Node.js中的require('relative/path/to/my-own-lib')
)
就是这样。在Go中我遵循相同的逻辑但我的结果是:
$ go run main.go
main.go:4:8: open /Users/mt/Documents/Codes/go/src/github.com/mt/Apollo/tst: no such file or directory
我的档案:
main.go
package main
import "fmt"
import "./tst"
func main() {
fmt.Println("just testing")
tst.p()
}
tst.go
package tst
import "fmt"
func p() {
fmt.Println("ola")
}
当然我的文件结构是:
myFolder/
|- main.go
|_ tst.go
有人能告诉我这样做的正确方法是什么?
答案 0 :(得分:3)
如果你将tst.go的包设置为“package main”,你将能够访问p()而不需要任何import语句。
$ 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/
请解释您的downvote
这里有一些着名的惯用Go项目的例子,就像我说的那样:
这些是可执行文件,代码分为多个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。
答案 1 :(得分:1)
如果我正确地阅读了这个问题:
导入路径应该是$ 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")
}
目录结构如下:
MT /阿波罗/ main.go
MT /阿波罗/ TST / tst.go
另外需要注意的是我在func p()中大写了“P”。不导出小写标识符。有关here
的更多信息