关于导入:如何在Golang中使用自定义包?

How to use custom packages in Golang?

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

百万富翁

1
2
3
4
5
package mylib

type SomeType struct {

}

主走

1
2
3
4
5
6
7
8
9
package main

import (
   "mylib"
)

func main() {

}

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

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

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


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

实际答案取决于您的"定制包"的性质。

如果它是通用的,考虑使用所谓的"Github代码布局"。基本上,您可以使您的库成为一个单独的go get表项目。

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

  • 将包含库文件的目录放在项目目录下。
  • 在项目的其余部分中,使用库相对于包含该项目的工作区根目录的路径来引用库。
  • 证明:

    1
    2
    3
    4
    5
    6
    src/
      myproject/
        mylib/
          mylib.go
          ...
        main.go

    现在,在顶级的main.go中,您可以使用import"myproject/mylib",它可以正常工作。


    对于这种文件夹结构:

    1
    2
    3
    main.go
    mylib/
      mylib.go

    最简单的方法是使用:

    1
    2
    3
    import (
       "./mylib"
    )


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

    1
    2
    3
    4
    5
    6
    7
    github.com/
      laike9m/
        myproject/
          mylib/
            mylib.go
            ...
          main.go

    百万富翁

    1
    2
    3
    package mylib

    ...

    主走

    1
    2
    3
    import"github.com/laike9m/myproject/mylib"

    ...

    我是一个经验丰富的程序员,但是,刚进入围棋世界!我承认我几乎没遇到什么困难去理解…当我试图在子文件夹中组织我的go文件时,也遇到了同样的问题。我的做法是:

    转到目录(分配给$gopath的目录)

    1
    2
    3
    4
    5
    6
    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

    在文件myprojectentitiesfibooclient.go上

    1
    2
    3
    4
    5
    6
    package Fiboo

    type Client struct{
        ID int
        name string
    }

    在文件myprojectmain.go上

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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)

    记住,伙计们,我是新来的。如果我做的是不好的练习,请告诉我!


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

    然后,import"mylib"将编译。


    包装词典

    1
    2
    3
    4
    5
    6
    7
    type Analizador struct {

    }

    func main() {

    }

    恩拉克包装主体

    1
    2
    3
    4
    import (

       "github.com/user/lexico
    )