パッケージは、同じディレクトリに存在し、先頭に同じパッケージステートメントを持つGoファイルで構成されます。 プログラムをより洗練させるために、パッケージから追加の機能を含めることができます。 一部のパッケージはGo標準ライブラリから入手できるため、Goインストールとともにインストールされます。 他のものは、Goの「+ go get +」コマンドでインストールできます。 また、必要なパッケージステートメントを使用してコードを共有するディレクトリと同じディレクトリにGoファイルを作成して、独自のGoパッケージを構築することもできます。

このチュートリアルでは、他のプログラミングファイル内で使用するGoパッケージを作成する方法を説明します。

前提条件

パッケージの作成とインポート

パッケージの作成は、他のGoファイルの作成と同じです。 パッケージには、関数の定義、https://www.digitalocean.com/community/tutorials/understanding-data-types-in-go [types]、およびhttps://www.digitalocean.com/community/tutorials/howを含めることができます。 -to-variables-and-go-in-go#understanding-variables [variables]は、他のGoプログラムで使用できます。

新しいパッケージを作成する前に、Goワークスペースにいる必要があります。 これは通常、「+ gopath 」の下にあります。 このチュートリアルの例では、パッケージを ` greet `と呼びます。 これを行うために、プロジェクトスペースの下の「 gopath 」に「 greet 」というディレクトリを作成しました。 組織が ` gopherguides `であり、Githubをコードリポジトリとして使用しながら、組織の下に ` greet +`パッケージを作成する場合、ディレクトリは次のようになります。

└── $GOPATH
   └── src
       └── github.com
           └── gopherguides

`+ greet `ディレクトリは ` gopherguides +`ディレクトリ内にあります:

└── $GOPATH
   └── src
       └── github.com
           └── gopherguides
               └── greet

最後に、ディレクトリに最初のファイルを追加できます。 パッケージ内の + primary`または + entry point`ファイルは、ディレクトリの名前にちなんで命名されるのが一般的な慣行と考えられています。 この場合、 `+ greet `ディレクトリ内に ` greet.go +`というファイルを作成します:

└── $GOPATH
   └── src
       └── github.com
           └── gopherguides
               └── greet
                   └── greet.go

ファイルを作成したら、プロジェクト間で再利用または共有したいコードを書き始めることができます。 この場合、 + Hello World`を出力する + Hello + `という関数を作成します。

テキストエディタで `+ greet.go +`ファイルを開き、次のコードを追加します。

greet.go

package greet

import "fmt"

func Hello() {
   fmt.Println("Hello, World!")
}

この最初のファイルを分類しましょう。 各ファイルの最初の行には、作業している `+ package `の名前が必要です。 あなたは ` greet `パッケージにいるので、 ` package +`キーワードとパッケージ名を使用します:

package greet

これにより、コンパイラはファイル内のすべてを `+ greet +`パッケージの一部として扱うようになります。

次に、 `+ import `ステートメントで使用する必要がある他のパッケージを宣言します。 このファイルで使用しているのは ` fmt +`パッケージのみです:

import "fmt"

最後に、関数「+ Hello 」を作成します。 ` fmt `パッケージを使用して、 ` Hello、World!+`を出力します。

func Hello() {
   fmt.Println("Hello, World!")
}

`+ greet `パッケージを作成したので、作成した他のパッケージで使用できます。 ` greet +`パッケージを使用する新しいパッケージを作成しましょう。

`+ example `というパッケージを作成します。つまり、 ` example `というディレクトリが必要です。 ` gopherguides +`組織でこのパッケージを作成すると、ディレクトリ構造は次のようになります。

└── $GOPATH
   └── src
       └── github.com
           └── gopherguides
                   └── example

新しいパッケージのディレクトリができたので、エントリポイントファイルを作成できます。 これは実行可能プログラムになるため、エントリポイントファイルに「+ main.go +」という名前を付けることがベストプラクティスと見なされます。

└── $GOPATH
   └── src
       └── github.com
           └── gopherguides
               └── example
                   └── main.go

テキストエディタで、 `+ main.go `を開き、次のコードを追加して ` greet +`パッケージを呼び出します:

main.go

package main

import "github.com/gopherguides/greet"

func main() {
   greet.Hello()
}

パッケージをインポートしているため、パッケージ名をドット表記で参照して関数を呼び出す必要があります。 _Dot notation_は、使用しているパッケージの名前と、使用したいパッケージ内のリソースの間にピリオド「。」を挿入する方法です。 たとえば、 `+ greet `パッケージには、リソースとして ` Hello `関数があります。 そのリソースを呼び出したい場合は、 ` greet.Hello()+`のドット表記を使用します。

これで、ターミナルを開いてコマンドラインでプログラムを実行できます。

go run main.go

すると、次の出力が表示されます。

OutputHello, World!

パッケージで変数を使用する方法を確認するために、 `+ greet.go +`ファイルに変数定義を追加しましょう。

greet.go

package greet

import "fmt"



func Hello() {
   fmt.Println("Hello, World!")
}

次に、 `+ main.go `ファイルを開き、次の強調表示された行を追加して、 ` fmt.Println()`関数の ` greet.go +`から変数を呼び出します。

main.go

package main

import (
   "fmt"

   "github.com/gopherguides/greet"
)

func main() {
   greet.Hello()


}

プログラムを再度実行したら:

go run main.go

次の出力が表示されます。

OutputHello, World!
Sammy

最後に、 `+ greet.go `ファイルでタイプも定義しましょう。 ` name `と ` color `フィールドを備えたタイプ ` Octopus +`と、呼び出されたときにフィールドを出力する関数を作成します。

greet.go

package greet

import "fmt"

var Shark = "Sammy"










func Hello() {
   fmt.Println("Hello, World!")
}

`+ main.go +`を開いて、ファイルの最後にそのタイプのインスタンスを作成します。

main.go

package main

import (
   "fmt"

   "github.com/gopherguides/greet"
)

func main() {
   greet.Hello()

   fmt.Println(greet.Shark)







}

`+ oct:= greet.Octopus `で ` Octopus `タイプのインスタンスを作成したら、 ` main.go `ファイルの名前空間内のタイプの関数とフィールドにアクセスできます。 これにより、 ` greet `を呼び出さずに、最後の行に ` oct.String()`を記述できます。 たとえば、 ` greet `パッケージの名前を参照せずに、 ` oct.Color +`などのタイプフィールドの1つを呼び出すこともできます。

`+ Octopus `タイプの ` String `メソッドは、 ` fmt.Sprintf `関数を使用して文を作成し、呼び出し元(この場合はメインプログラム)に対して結果、文字列、 ` returns +`を使用します。 。

プログラムを実行すると、次の出力が表示されます。

go run main.go
OutputHello, World!
Sammy
The octopus's name is "Jesse" and is the color orange.

+ Octopus`で + String`メソッドを作成することで、カスタムタイプに関する情報を出力する再利用可能な方法が得られます。 将来このメソッドの動作を変更する場合は、この1つのメソッドのみを編集する必要があります。

エクスポートされたコード

お気付きかもしれませんが、呼び出した `+ greet.go `ファイルの宣言はすべて大文字になっています。 Goには、他の言語のように「 public」、「+ private」、および「+ protected」修飾子の概念はありません。 外部の可視性は大文字で制御されます。 大文字で始まる型、変数、関数などは、現在のパッケージの外部で公開されています。 パッケージの外側に表示されるシンボルは、「+ exported +」と見なされます。

`+ reset `という名前の新しいメソッドを ` Octopus `に追加すると、 ` greet `パッケージ内から呼び出すことができますが、 ` greet `の外側にある ` main.go +`ファイルからは呼び出せませんパッケージ:

greet.go

package greet

import "fmt"

var Shark = "Sammy"

type Octopus struct {
   Name  string
   Color string
}

func (o Octopus) String() string {
   return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color)
}






func Hello() {
   fmt.Println("Hello, World!")
}

`+ main.go `ファイルから ` reset +`を呼び出そうとした場合:

main.go

package main

import (
   "fmt"

   "github.com/gopherguides/greet"
)

func main() {
   greet.Hello()

   fmt.Println(greet.Shark)

   oct := greet.Octopus{
       Name:  "Jesse",
       Color: "orange",
   }

   fmt.Println(oct.String())


}

次のコンパイルエラーが表示されます。

Outputoct.reset undefined (cannot refer to unexported field or method greet.Octopus.reset)

「+ Octopus To」から「+ reset」機能を「+ export」するには、「+ reset 」で「 R +」を大文字にします。

greet.go

package greet

import "fmt"

var Shark = "Sammy"

type Octopus struct {
   Name  string
   Color string
}

func (o Octopus) String() string {
   return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color)
}

func (o *Octopus) eset() {
   o.Name = ""
   o.Color = ""
}

func Hello() {
   fmt.Println("Hello, World!")
}

結果として、エラーを発生させることなく、他のパッケージから `+ Reset +`を呼び出すことができます。

main.go

package main

import (
   "fmt"

   "github.com/gopherguides/greet"
)

func main() {
   greet.Hello()

   fmt.Println(greet.Shark)

   oct := greet.Octopus{
       Name:  "Jesse",
       Color: "orange",
   }

   fmt.Println(oct.String())



   fmt.Println(oct.String())
}

プログラムを実行する場合:

go run main.go

次の出力が表示されます。

OutputHello, World!
Sammy
The octopus's name is "Jesse" and is the color orange
The octopus's name is "" and is the color .

「+ Reset On」を呼び出すことで、「+ Name」フィールドと「+ Color」フィールドのすべての情報を消去しました。 + String`メソッドを呼び出すと、フィールドが空になっているため、 + Name`と `+ Color W`が通常表示される場所には何も出力されません。

結論

Goパッケージの作成は、他のGoファイルの作成と同じですが、別のディレクトリに配置すると、コードを分離して他の場所で再利用できます。 このチュートリアルでは、パッケージ内に定義を記述する方法を説明し、別のGoプログラミングファイル内でそれらの定義を使用する方法を示し、アクセスするためにパッケージを保持する場所のオプションについて説明しました。