如何使用自定义包


178

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


我没有设置GOPATH变量,只有GOROOT。
laurent

1
go installmylibfirst 目录下运行,然后重试。

1
另请参见此线程
kostix

@Joe,通过在内部运行“ go install”仍然无法工作
hunter_tech

Answers:


175

首先,请务必阅读并理解“如何编写Go代码”文档。

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

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

如果您的库供内部使用,则可以这样:

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

展示:

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

现在,在顶层中main.go,您可以import "myproject/mylib"并且它将正常运行。


1
如果我在src /下创建一个新项目(myproject2),如何导入mylib?
Kiril

2
@Kiril,您的意思是,您如何导入mylib代码myproject2?然后答案是“通过使用import "myproject/mylib"-想法是Go在从GOPATH环境变量提取的每个目录下搜索导入的路径(它们称为“工作区”),但是(幸运的)此搜索不是递归的,因此此类路径是
。– kostix 2014年

4
另一个必须阅读的内容是:“包装名称”
kostix 2015年

1
@MatthiasSommer,通常是通过将mylib提取到每个微服务使用的通用包中来实现的。“用途”的确切定义取决于您喜欢的工作流程。在企业级开发,vendoring通常使用,但随着近年来go mod的发展,一个模块可能是答案(和go mod支撑模块的vendoring以及)。
kostix

1
@LeiYang,“要导入的软件包”是包含一个或多个Go源文件的目录。至于“如何将程序包构建为.lib文件,然后导入lib文件”,答案取决于您的实际意图。如果您担心编译速度,则不必担心:Go工具链会缓存。在每个包基础上构建的所有结果相反,如果你要问是否有可能来编译和发布二进制编译只包,那么答案是没有
kostix

67

对于这种文件夹结构:

main.go
mylib/
  mylib.go

最简单的方法是使用此方法:

import (
    "./mylib"
)

1
在go的最新版本中,此功能不再起作用,因为找不到该软件包。正确的导入应该是foo/mylib(假设包含main.go的文件夹是foo)。
nemo 2013年

6
@nemo,使用go的最新版本,我始终使用“ ./mylib”,并且可以正常工作。
洛伦特

3
使用go 1.2,我同意@ this.lau_
canadadry 2014年

8
请注意,这会go install中断。如果您要构建一个供人们下载并运行的独立项目,那go build很好-但是,如果您需要全面的go install支持,我将采用上述的“ Github代码布局”(即使关闭了bitbucket或类似的东西)。
2014年

我建议不要用这种方式。它会破坏godef的。godef它不了解“。” 进口商品
King Jk

6

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

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

mylib.go

package mylib

...

main.go

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

...

6

我是一位经验丰富的程序员,但是对于Go world来说还很陌生!而且我承认我在理解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的新手。如果我的做法不好,请告诉我!


3

另一个解决方案:
添加src/myproject到$ GOPATH。

然后import "mylib"将编译。


这对于go gettable路径(例如github托管包)不起作用。
古斯塔夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.