193

我正在尝试在 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,但它似乎没有做任何事情(没有生成文件,没有错误消息)。所以知道我该怎么做吗?

4

8 回答 8

183

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

实际答案取决于您的“自定义包”的性质。

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

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

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

展示:

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

现在,在顶层main.go,你可以import "myproject/mylib"并且它会正常工作。

于 2013-02-24T11:14:18.573 回答
72

对于这种文件夹结构:

main.go
mylib/
  mylib.go

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

import (
    "./mylib"
)
于 2013-08-13T05:27:37.790 回答
7

我是一位经验丰富的程序员,但是,对 Go 世界很陌生!而且我承认我在理解 Go 时遇到了一些困难......在尝试将我的 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)

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

于 2017-12-24T18:11:44.930 回答
6

对于托管在 GitHub 上的项目,人们通常会这样做:</p>

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

mylib.go

package mylib

...

main.go

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

...
于 2017-07-06T15:08:56.987 回答
2

另一种解决方案:
添加src/myproject到 $GOPATH.

然后import "mylib"会编译。

于 2014-07-22T16:14:35.473 回答
2

我尝试了很多方法,但最好的方法是使用 go.mod 并放置

module nameofProject.com

然后我从我使用的同一个项目中导入

import("nameofProject.com/folder")

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

于 2020-07-21T17:14:43.260 回答
0

对于遇到这个问题的人,需要先初始化 go 模块,然后才能使用自定义包。

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

于 2021-06-01T10:33:36.443 回答
0

这里的基本问题是定制将包编译为库二进制文件的想法,然后在一些新的 go 项目中将二进制代码作为“net/http”或“fmt”等第三方库导入,而不是使用原始的 go 代码。我想知道这对于 Go 编程是否可行。

于 2021-09-17T05:47:31.800 回答