在Go中导入自定义包

时间:2018-12-21 05:54:33

标签: go

checked out this answer,由于某种原因,我无法正确理解或无法正常工作

另外,在我开始之前,我已经知道了如何使用github来实现它,但是我想在没有github的情况下尝试它

首先,我有一个main.go文件

package main

import (
    "fmt"
    "math"
    "subpack"
)

//You Import packages without using comma in Go, rather space or new line
//In VS Code, if you use aren't using the package and run then it will automatically removie it

func main() {
    fmt.Println("hello world")
    //We use math.Floor to round the nunmber
    fmt.Println(math.Floor(2.7))
    fmt.Println(math.Sqrt(16))
    fmt.Println(subpack.Reverse)
}

请注意subpack,这是我制作的自定义程序包。子包像这样存在

enter image description here

并包含以下代码

package subpack

//If we make this in the same root level of our main it will throw an error

func Reverse(s string) string {
    runes := []rune(s)
    for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
        runes[i], runes[j] = runes[j], runes[i]
    }
    return string(runes)
}

运行我们的程序会引发以下错误

cannot find package "subpack" in any of:
        /usr/local/go/src/subpack (from $GOROOT)
        /Users/anilbhatia/go/src/subpack (from $GOPATH)

问题:是否可以,如果可以的话,如何在不使用github的情况下使用自定义包,而不在GO主文件夹中使用自定义包,而只需引用包含我们的go文件的文件夹即可我们正在使用的目录。

3 个答案:

答案 0 :(得分:2)

如错误所示,编译器无法从其中一个找到subpack

  

/ usr / local / go / src / subpack(来自$ GOROOT)

标准库软件包(例如fmtstrings)所在的位置,或

  

/ Users / anilbhatia / go / src / subpack(来自$ GOPATH)

用户安装/定义的软件包所在的位置。

要进行导入,您只需在subpack中包含$GOPATH/src包的相对路径(相对于main.go

假设您的main.go/Users/anilbhatia/go/src/parentpack中,则其导入应为

import "parentpack/subpack"

如果我对您的理解正确,则您希望subpack的呼叫者(例如main.go)位于subpack的无关位置。这实际上是开箱即用的。您的main.go可以位于任何地方。编译时,编译器会看到parentpack/subpack的导入路径,并转到$GOPATH/src$GOROOT/src进行查找。

有关源代码组织和一些典型示例的更多信息,可以运行

 go help gopath

在您的外壳中。

答案 1 :(得分:1)

起点是$ GOPATH / src,而不是项目的文件夹。
所以你应该使用

import "myproject/subpack"

而不是:

import "subpack"

答案 2 :(得分:0)

出于某种原因,这个问题的所有答案都已经超过 2 年并且已经过时了。你现在绝对可以做到。我认为 Go 的最新版本发生了变化,允许导入不在 $GOPATH 中的自定义包。你可以简单地通过在 main.go 中导入你的“子包”来做你想做的事情:

import "./subpack"