如何在golang中使用自定义包?

lau*_*ent 168 import package go

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

mylib.go

package mylib

type SomeType struct {

}
Run Code Online (Sandbox Code Playgroud)

main.go

package main

import (
    "mylib"
)

func main() {

}
Run Code Online (Sandbox Code Playgroud)

当我尝试时go run main.go,我收到此错误:

main.go:4:2: import "mylib": cannot find package
Run Code Online (Sandbox Code Playgroud)

我试图先运行go build mylib.go但它似乎没有做任何事情(没有生成文件,没有错误信息).所以任何想法我怎么能这样做?

kos*_*tix 166

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

实际答案取决于"自定义包"的性质.

如果它是一般用途,请考虑采用所谓的"Github代码布局".基本上,您将库go get设为一个单独的项目.

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

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

展示:

src/
  myproject/
    mylib/
      mylib.go
      ...
    main.go
Run Code Online (Sandbox Code Playgroud)

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

  • 另一个必读:["包名"](https://blog.golang.org/package-names). (4认同)
  • @Kiril,你的意思是,如何在`myproject2`的代码中导入`mylib`?然后答案是"通过使用`import"myproject/mylib"` - 想法是Go搜索从'GOPATH`环境变量中提取的每个目录下的导入路径(它们被称为"工作空间"),但这个搜索是(幸运的)*不是递归的,*所以这样的路径有效地"锚定"在它们各自的工作空间. (2认同)

lau*_*ent 64

对于这种文件夹结构:

main.go
mylib/
  mylib.go
Run Code Online (Sandbox Code Playgroud)

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

import (
    "./mylib"
)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这会使"go install"中断.如果你正在构建一个你希望人们下载并运行`go build`的独立项目,这很好 - 但是,我会使用上面提到的"Github代码布局"(即使关闭bitbucket或类似)如果你想要完整的"去安装"支持. (8认同)
  • @ nemo,使用go的最新版本,我总是使用"./mylib"并且它有效. (6认同)
  • 使用go 1.2,我同意@ this.lau_ (3认同)
  • 这在最新版本的 go 中不再起作用,因为找不到包。正确的导入应该是 `foo/mylib`(假设包含 main.go 的文件夹是 `foo`)。 (2认同)

lai*_*e9m 6

对于在GitHub上托管的项目,以下是人们通常做的事情:

github.com/
  laike9m/
    myproject/
      mylib/
        mylib.go
        ...
      main.go
Run Code Online (Sandbox Code Playgroud)

mylib.go

package mylib

...
Run Code Online (Sandbox Code Playgroud)

main.go

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

...
Run Code Online (Sandbox Code Playgroud)


Die*_*ero 6

我是一名经验丰富的程序员,但是,对 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
Run Code Online (Sandbox Code Playgroud)

在文件 MyProject\Entities\Fiboo\Client.go

package Fiboo

type Client struct{
    ID int
    name string
}
Run Code Online (Sandbox Code Playgroud)

在文件 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
}
Run Code Online (Sandbox Code Playgroud)

(我在 Ubuntu 16.04 上运行 Go 1.9)

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