golang 構造メソッド

PHPz
PHPzオリジナル
2023-04-21 15:16:32148ブラウズ

Golang は効率的なプログラミング言語であり、その構造メソッドは Golang の特筆すべき機能の 1 つです。 Golang は構造体を使用してデータを整理し、構造体メソッドは構造体のデータを操作する関数です。この記事では、Golang の構造メソッドの概念、構文、例を紹介します。

1. Golang 構造メソッドの概要

Golang では、構造はさまざまなタイプのデータを組み合わせることができるユーザー定義のタイプを表します。構造体に含まれるデータはフィールドと呼ばれます。構造体メソッドは、構造体タイプの値のデータとフィールドを変更および操作できる構造体に関連する関数です。 Golang の Struct メソッドは、オブジェクト指向プログラミングのクラス メソッドに似ていますが、構文にいくつかの違いがあります。

以下は、名前と年齢の 2 つのフィールドを持つ person 構造体を定義し、greet() メソッドを定義する例です:

<code class="go">type person struct {
    name string
    age int
}

func (p person) greet() {
    fmt.Printf("Hello, my name is %s and I am %d years old\n", p.name, p.age)
}</code>

この例では、func で始まる Golang のメソッド宣言構文が使用されています。キーワード、その後に受信者を定義するかっこ、その後にメソッド名とメソッド本体が続きます。ここで、受信者は p という名前の person 型の値です。メソッド名はgreet()で、パラメータは必要ありません。メソッド本体に挨拶が出力されます。

2. Golang 構造メソッドの構文

Golang の構造メソッド定義には 3 つの重要な部分が含まれています:

  • メソッド名
  • メソッド本体
  • このうち、メソッド レシーバーは必須であり、これが使用されます。受信メソッドの構造タイプを指定します。メソッド受信機のタイプは 2 つあります。

Value Receiver
  • Pointer Receiver
  • バリューレシーバーにおいて、メソッドレシーバーは構造体型の値です。レシーバーでメソッドが呼び出されると、レシーバーのコピーが作成され、そのコピー上でメソッドが実行されます。この場合、値へのポインタではなく、構造体の値が使用されます。このメソッドは構造内のデータをクエリできますが、構造の値を変更することはできません。

ポインタレシーバでは、メソッドレシーバは構造体型のポインタです。メソッドが受信側で呼び出されるとき、メソッドはこのポインターで実行されます。この場合、構造体の値ではなく、構造体へのポインターが使用されます。このメソッドは、構造内のデータをクエリおよび変更できます。

以下は 2 つのメソッド レシーバーの例です:

<code class="go">type person struct {
    name string
    age int
}

// 值接收者方法
func (p person) Greet() {
    fmt.Printf("Hello, my name is %s and I am %d years old\n", p.name, p.age)
}

// 指针接收者方法
func (p *person) SetAge(age int) {
    p.age = age
}</code>

この例では、最初のメソッド Greet() は値レシーバーを使用し、2 番目のメソッド SetAge() はポインター レシーバーを使用します。

注: 値レシーバーまたはポインター レシーバーの使用は、実際のシナリオによって異なります。一般に、構造体の値を変更する必要がある場合は、ポインター レシーバーを使用する方が適切です。構造体の値、値レシーバーを使用するだけです。

3. Golang 構造メソッドの例

以下では、実際的な例を使用して Golang 構造メソッドの使用方法を示します。

1. 値受信メソッド

<code class="go">package main

import "fmt"

type Rectangle struct {
    width, height float64
}

func (r Rectangle) Area() float64 {
    return r.width * r.height
}

func (r Rectangle) Perimeter() float64 {
    return 2 * (r.width + r.height)
}

func main() {
    rect := Rectangle{width: 10, height: 5}
    fmt.Println("Area of rectangle:", rect.Area())
    fmt.Println("Perimeter of rectangle:", rect.Perimeter())
}</code>

出力:

<code>Area of rectangle: 50
Perimeter of rectangle: 30</code>

この例では、幅と高さの 2 つのフィールドを持つ Rectangle 構造を定義します。次に、Area() メソッドと Perimeter() メソッドの 2 つのメソッドを実装しました。 Area() メソッドは長方形の面積を計算し、Perimeter() メソッドは長方形の周囲長を計算します。どちらのメソッドも値レシーバーを使用します。これは、四角形の値をクエリするだけで、値を変更しないためです。

2. ポインター受信メソッド

<code class="go">package main

import "fmt"

type Rectangle struct {
    width, height float64
}

func (r *Rectangle) Area() float64 {
    return r.width * r.height
}

func (r *Rectangle) Perimeter() float64 {
    return 2 * (r.width + r.height)
}

func (r *Rectangle) Resize(width, height float64) {
    r.width += width
    r.height += height
}

func main() {
    rect := Rectangle{width: 10, height: 5}
    fmt.Println("Area of rectangle:", rect.Area())
    fmt.Println("Perimeter of rectangle:", rect.Perimeter())

    rect.Resize(5, 5)
    fmt.Println("After resizing:")
    fmt.Println("Area of rectangle:", rect.Area())
    fmt.Println("Perimeter of rectangle:", rect.Perimeter())
}</code>

出力:

<code>Area of rectangle: 50
Perimeter of rectangle: 30
After resizing:
Area of rectangle: 100
Perimeter of rectangle: 40</code>

この例では、Rectangle 構造体と 2 つのメソッド、Area() と Perimeter() も定義します。ただし、ここでは Resize() メソッドも実装します。このメソッドはポインター レシーバーを使用して Rectangle 構造体の値を変更できるようにします。 main() 関数では、Rectangle 構造体を作成し、Area() と Perimeter() を使用して長方形の面積と周囲長を計算します。次に、Resize() メソッドを使用して長方形を拡大縮小し、面積と周囲長を再度計算しました。

4. 概要

Golang の構造メソッドは、構造型の値をより効率的に操作するのに役立ちます。構造化メソッドを使用すると、演算とデータを組み合わせて、より明確で簡潔なプログラムを作成できます。メソッドのレシーバは、構造体タイプの値またはポインタにすることができ、必要に応じて異なるレシーバ タイプを選択できます。さらに、メソッドにパラメータや戻り値を追加したり、メソッド呼び出し中に複数のメソッドをチェーンで呼び出したりすることもできます。メソッド宣言では、レシーバーの型とメソッド名の間にスペースが存在する必要があることに注意してください。存在しないとコンパイル エラーが発生します。実際のアプリケーションでは、実際の状況に応じて適切な受信機のタイプを選択し、さまざまな方法を柔軟に使用してさまざまなデータ操作に対処する必要があります。

以上がgolang 構造メソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。