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

时间:2016-01-23 18:47:28

标签: go import

我在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

有人能告诉我这样做的正确方法是什么?

2 个答案:

答案 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

的更多信息