カスタムパッケージの使用方法


178

Goでカスタムパッケージを作成して使用しようとしています。それはおそらく非常に明白なものですが、これについては多くの情報を見つけることができません。基本的に、私はこれら2つのファイルを同じフォルダーに入れます。

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のみを設定しました。
ローレント2013

1
最初go installのディレクトリの下で実行し、mylib再試行してください。
Joe

1
このスレッドも参照してください。
kostix 2013

@Joe、それでも「go install」を実行しても機能しない
hunter_tech

回答:


175

まず、「Goコードの書き方」ドキュメントを必ず読んで理解してください。

実際の答えは、「カスタムパッケージ」の性質によって異なります。

一般的な使用を目的とする場合は、いわゆる「Githubコードレイアウト」の使用を検討してください。基本的に、ライブラリを独立したgo get-tableプロジェクトにします。

ライブラリが内部で使用する場合は、次のようにすることができます。

  1. ライブラリファイルのあるディレクトリをプロジェクトのディレクトリの下に配置します。
  2. プロジェクトの残りの部分では、プロジェクトを含むワークスペースのルートに対する相対パスを使用してライブラリを参照します。

実証するには:

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

これで、トップレベルmain.goので、できるようにimport "myproject/mylib"なり、問題なく動作します。


1
src /の下に新しいプロジェクト(myproject2)を作成する場合、どうすればmylibをインポートできますか?
キリル

2
@Kiril、つまり、どのようにしmylibてコードにインポートしmyproject2ますか?次に、答えは「使用import "myproject/mylib"することです。つまり、GoはGOPATH環境変数から抽出された各ディレクトリの下でインポートされたパスを検索します(これらは「ワークスペース」と呼ばれます)が、この検索は(幸運にも)再帰的ではないためそのようなパスはそれぞれのワークスペースで効果的に「固定」されます
kostix

4
別の必読:「パッケージ名」
kostix

1
@MatthiasSommer(通常、各マイクロサービスが使用する共通パッケージにmylibを抽出することにより)。「用途」の正確な定義方法は、希望するワークフローによって異なります。エンタープライズグレードの開発では、通常、ベンダリングが使用されますが、最近のgo mod開発では、モジュールが答えになる可能性があります(go modモジュールのベンダリングもサポートしています)。
kostix

1
@LeiYang、「インポートされるパッケージ」は、1つ以上のGoソースファイルを含むディレクトリです。「パッケージを.libファイルにビルドしてからlibファイルをインポートする方法」に関しては、答えは実際に何を要求したいかによって異なります。コンパイル速度に関心がある場合は、心配しないでください:Goツールチェーンキャッシュすべてのビルド結果はパッケージごとです。代わりに、バイナリのみのコンパイル済みパッケージをコンパイルして配布できるかどうかを確認したい場合、答えは「いいえ」です
kostix

68

この種のフォルダー構造の場合:

main.go
mylib/
  mylib.go

最も簡単な方法はこれを使うことです:

import (
    "./mylib"
)

1
最近のバージョンのgoでは、パッケージが見つからないため、これは機能しません。正しいインポートはfoo/mylib次のとおりです(main.goを含むフォルダーがであると想定foo)。
nemo 2013

6
@ nemo、goの最新バージョンでは、常に "./mylib"を使用します。
ローレント2013

3
go 1.2を使用して、@ this.lau_に同意する
カナダ、

8
これがgo install壊れることに注意してください。他の人にダウンロードして実行go buildしてもらいたいスタンドアロンプ​​ロジェクトを構築している場合は問題ありませんが、完全なgo installサポートが必要な場合は、上記の「Githubコードレイアウト」を使用します(bitbucketがオフの場合など)。。
光イオン化

この方法は使用しないでください。それは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の世界にはまったく新しい人です。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を実行しています)

みんな覚えて、私は囲碁の初心者です。私がしていることが悪い習慣であるなら、知らせてください!


3

別の解決策:$ GOPATHに
追加src/myprojectします。

その後、import "mylib"コンパイルします。


これは、githubがホストするパッケージなどのgo gettableパスでは機能しません。
グスタフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.