Go 言語では、構造体はさまざまな型のメンバー フィールドのセットで構成されるユーザー定義のデータ型であり、構造体に対して操作を実行するメソッドを定義できます。 Go 言語のメソッドと関数の種類は非常に似ていますが、メソッドと関数は異なります。メソッドは、構造体タイプで定義された関数です。この記事では、構造体型のメソッドを定義する方法を説明します。
1. Golang のメソッドとは何ですか?
Go 言語では、メソッドはこのタイプのデータを操作する関数です。メソッドは、バインドされているタイプのすべてのパブリック フィールドとメソッドにアクセスできます。これらの構文は関数に似ていますが、唯一の違いは、シグネチャ内でメソッド名の前に、このメソッドが属する構造体の型であるレシーバが付いていることです。
例:
type Rectangle struct { width, height int } func (r Rectangle) area() int { return r.width * r.height }
ここでは構造体タイプ「Rectangle」が定義され、それに対してメソッド「area」が定義されています。このメソッドは、長方形の面積を計算して整数値を返します。関数シグネチャの「(r Rectangle)」に注意してください。これは、「Rectangle」型でこのメソッドを呼び出すことができるレシーバーです。
メソッドを実装するコードでは、レシーバーを定義する必要があります。レシーバーは値型またはポインター型のいずれかになります。値型レシーバーは値のコピーをメソッドのレシーバーとして使用し、ポインター型レシーバーは値へのポインターをメソッドのレシーバーとして使用します。ポインター型レシーバーの場合、メソッドは値自体を変更することも、他のメソッドを呼び出して値を変更することもできます。値型受信機の場合、これらの変更は無視されます。
2. 型のメソッドを定義するにはどうすればよいですか?
以下は、構造体型のメソッドを定義する方法を示すサンプル プログラムです。
package main import "fmt" type Rectangle struct { width, height int } func (r Rectangle) area() int { return r.width * r.height } func (r Rectangle) perimeter() int { return 2 * (r.width + r.height) } func main() { r := Rectangle{10, 5} fmt.Println("Area: ", r.area()) fmt.Println("Perimeter: ", r.perimeter()) }
このプログラムでは、「Rectangle」という名前の構造体タイプを定義します。このタイプには、「エリア」と「周囲」という 2 つのメソッドを定義します。
「area」メソッドは長方形の面積を返し、「perimeter」メソッドは長方形の周囲長を返します。
「main」関数では、「r」という名前の Rectangle 型のインスタンスを作成します。 「r.area()」メソッドと「r.perimeter()」メソッドを呼び出して長方形の面積と周囲長を取得し、その値をコンソールに出力します。
3. 型でのポインター型レシーバーの使用
次に、Rectangle 型のプロパティを変更するとします。受信側では値型ではなくポインター型を使用する必要があります。このようにして、インスタンス内のフィールドを変更できます。
type Rectangle struct { width, height int } func (r *Rectangle) area() int { return r.width * r.height } func (r *Rectangle) perimeter() int { return 2 * (r.width + r.height) } func (r *Rectangle) resize(newWidth int, newHeight int) { r.width = newWidth r.height = newHeight } func main() { r := &Rectangle{10, 5} fmt.Println("Area: ", r.area()) fmt.Println("Perimeter: ", r.perimeter()) r.resize(12, 6) fmt.Println("Area: ", r.area()) fmt.Println("Perimeter: ", r.perimeter()) }
上記のコードでは、レシーバーとしてポインター型「*Rectangle」を使用しています。これは、メソッド実装で型の値を変更できることを意味します。新しいメソッド "resize" を定義して、新しい幅と高さの値を渡し、それらを Rectangle の幅と高さのプロパティに割り当てます。
main 関数では、Rectangle インスタンス「r」へのポインターを作成します。次に、前に定義したメソッドを呼び出し、新しい高さと幅の値を「resize」メソッドに渡します。最後に、長方形の新しい領域と周囲をコンソールに出力します。
4. 概要
Go 言語では、メソッドは構造型で定義された関数です。これらのメソッドは、バインドされているタイプのすべてのパブリック フィールドとメソッドにアクセスできます。メソッドを実装するコードでは、レシーバーを定義する必要があります。レシーバーは値型またはポインター型のいずれかになります。値型レシーバーは値のコピーをメソッドのレシーバーとして使用し、ポインター型レシーバーは値へのポインターをメソッドのレシーバーとして使用します。ポインター型レシーバーの場合、メソッドは値自体を変更することも、他のメソッドを呼び出して値を変更することもできます。値型受信機の場合、これらの変更は無視されます。
以上がgolang が構造型のメソッドを定義する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。