Golang 中如何使用自定义包

我试图在Go中创建和使用一个自定义包。这可能是非常明显的事情,但我找不到太多关于这方面的信息。基本上,我在同一个文件夹中有这两个文件:

mylib.go

package mylib


type SomeType struct {


}

main.go

package main


import (
"mylib"
)


func main() {


}

当我尝试go run main.go时,我得到这个错误:

main.go:4:2: import "mylib": cannot find package

我试着先运行go build mylib.go,但它似乎没有做任何事情(没有生成文件,没有错误消息)。你知道我该怎么做吗?

188853 次浏览

首先,一定要阅读并理解“如何编写Go代码”文档。

实际的答案取决于你的“定制包”的性质。

如果它打算用于一般用途,可以考虑使用所谓的“Github代码布局”。基本上,你让你的库成为一个单独的go get-table项目。

如果你的库是供内部使用的,你可以这样做:

  1. 将包含库文件的目录放在项目目录下。
  2. 在项目的其余部分中,使用相对于包含项目的工作区根的路径引用库。

为了演示:

src/
myproject/
mylib/
mylib.go
...
main.go

现在,在顶层的main.go中,你可以import "myproject/mylib",它就可以正常工作了。

对于这种文件夹结构:

main.go
mylib/
mylib.go

最简单的方法是使用这个:

import (
"./mylib"
)
< br > < p >另一个解决方案: 添加src/myproject到$GOPATH.

然后import "mylib"将被编译。

对于一个托管在GitHub上的项目,人们通常会这样做:

github.com/
laike9m/
myproject/
mylib/
mylib.go
...
main.go

mylib.go

package mylib


...

main.go

import "github.com/laike9m/myproject/mylib"


...
我是一个有经验的程序员,但是,对围棋世界很陌生!我承认我在理解围棋方面几乎没有遇到什么困难…… 当我试图在子文件夹中组织我的go文件时,我也遇到了同样的问题。 我的方法是:

GO_Directory(分配给$GOPATH的目录)

GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name

文件MyProject\Entities\Fiboo\Client.go

package Fiboo


type Client struct{
ID int
name string
}

文件MyProject\main.go

package main


import(
Fiboo "./Entity/Fiboo"
)


var TableClient  Fiboo.Client


func main(){
TableClient.ID = 1
TableClient.name = 'Hugo'


// do your things here
}

(我在Ubuntu 16.04上运行Go 1.9)

记住,我是围棋新手。如果我的做法不好,请告诉我!

我尝试了很多方法,但我用的最好的。Mod和put

module nameofProject.com

然后我从相同的项目导入我使用

import("nameofProject.com/folder")

在任何地方创建项目都非常有用

对于那些面临这个问题的人,在使用自定义包之前,您需要首先初始化go模块。

例如,你的代码目录是:../mycode/main.go。现在你想要创建diffcode自定义包并将其导入main。你首先需要运行命令go mod init mycode(确保你在../mycode目录下)。现在你创建了包diffcode,它有一些文件。要导入这个包,你需要将它放入main.go: module/package。在这种情况下,mycode/diffcode

这里的关键问题是调整将包编译为库二进制代码的想法,然后将二进制代码作为第三方库导入,如“net/ httpquot;或“;fmt"在一些新的go项目中,而是使用原来的go代码。我想知道这是否可能用于go编程。

我终于找到了解决这个问题的办法。请注意,我有一个非常基本的编码环境,也使用基本的东西,因为我是一个初学者。我想像使用官方图书馆一样使用我的图书馆。我不需要编辑GOPATH或任何其他系统变量或路径,不需要重新构建或安装任何东西。下面是我从上到下的解决方案:

  1. 在我的主包中,我的代码如下:
    package main
    

import (
"mylib"  // This is my library!!
"fmt"
)
    

    

func main() {
...
mylib.myFunc(par)
mylib.myOtherFunc(par1,par2)
...
}
  1. 您必须在包实现文件中使用完全相同的包名。我自己的包如下所示:
package mylib


import (
"math"
"strconv"
"strings"
)


func myFunc(par int) {
...
}


func myOtherFunc(par1 string, par2 int) {
...
}
  1. 你必须记住的的名字的地方正确的所有东西:
  • 创建一个子文件夹,将包名放在其他包的旁边。你可以很容易地通过搜索找到他们。“bufio”,“os”或“math”(在我的机器上,它们在\Go\src下)。在我的例子中,它看起来是这样的:

     C:
    /Go
    /src
    /bufio
    /io
    /...
    /mylib
    /...
    /strings
    
  • 移动你的包文件到这个文件夹。文件夹名很重要,它必须与包名相同,这是编译器找到它的方式

  • 你可以在这里有一个或多个。go文件,它们不需要命名为mylib。去吧,你可以用任何名字。myMath。去,就是。去,等等。

  • 我重复一遍:所有。go文件中的包名必须是你的库名(在我的例子中是'mylib')

  1. 这样以后你就可以通过新的函数来扩展你自己的库,它们可以在单独的.go文件中实现,唯一重要的是你必须将这个文件存储在名为“mylib”的子文件夹中,并且包的名称必须相同。

我希望这能有所帮助,致以最好的问候。