ホームページ >バックエンド開発 >Golang >golang ポインタメソッドの違い

golang ポインタメソッドの違い

王林
王林オリジナル
2023-05-10 09:45:36676ブラウズ

Golang はオブジェクト指向プログラミングをサポートする言語で、実際の開発ではポインタやメソッドがよく使われます。ポインタは、変数のメモリ アドレスを格納する変数です。メソッドは型を指定する関数です。 Golang ではポインター メソッドと非ポインター メソッドの違いがあります。この記事では、これら 2 つのメソッドの違いと使用法について説明します。

1. ポインタ メソッド

ポインタ メソッドは、構造体ポインタにバインドされたメソッドです。ポインター メソッドには次の特性があります。

  1. ポインター メソッドのレシーバー型は、特定の型へのポインターです。
  2. ポインタ メソッドは、受信側が指す値を変更できます。
  3. 型のメソッドがそのレシーバー自体を変更する必要がある場合は、ポインター メソッドを使用する必要があります。

たとえば、構造体のタイプを定義します:

type Rectangle struct {
    width  float64
    height float64
}

ポインター メソッドを使用して、この構造体のインスタンスを変更できます:

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

上記のメソッドでは、Receiver (r *Rectangle) は Rectangle 構造体へのポインターです。このメソッドは、Rectangle のプロパティを設定するために使用されます。

2. 非ポインター メソッド

非ポインター メソッドは、構造体にバインドされたメソッドです。構造体のコピーをレシーバー パラメーターとして受け入れます。非ポインター メソッドには、次の特徴:

  1. 非ポインター メソッドのレシーバー型は、型の値のコピーです。
  2. 非ポインター メソッドはレシーバーの値を変更できません。

たとえば、構造体のタイプを定義します:

type Rectangle struct {
    width  float64
    height float64
}

非ポインター メソッドを使用して構造体の面積を計算できます:

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

In上記のメソッドでは、受信側 r Rectangle は Rectangle 構造体の値のコピーです。このメソッドは、長方形の面積を返します。

3. ポインター メソッドと非ポインター メソッドの違い

  1. ポインター メソッドはレシーバー内のプロパティを変更できますが、非ポインター メソッドは変更できません。
  2. ポインタ メソッドは、オブジェクトのアドレスに直接アクセスできるため、呼び出し時にオブジェクトのコピーを回避できます。この機能は、大規模な構造物を扱う場合に特に役立ちます。
  3. 非ポインター メソッドは呼び出し時にオブジェクト全体をコピーする必要があるため、パフォーマンスの問題が発生する可能性があります。
  4. メソッドを定義するとき、レシーバー自体を変更する必要がない場合は、非ポインター メソッドを使用できます。それ以外の場合は、ポインター メソッドを使用する必要があります。

たとえば、ポインタ メソッドを使用して構造を変更できます:

func main() {
    rect := Rectangle{width: 10, height: 5}
    fmt.Println("Width:", rect.width, "Height:", rect.height)
    rect.SetProperty(20, 10)
    fmt.Println("Width:", rect.width, "Height:", rect.height)
}

出力結果:

Width: 10 Height: 5
Width: 20 Height: 10

4. まとめ

Golang の場合このうち、ポインター メソッドと非ポインター メソッドには、それぞれ長所、短所、使用シナリオがあります。メソッドを定義するときは、オブジェクトの使用法とビジネス ニーズを考慮し、コードを記述する適切なメソッドを選択する必要があります。両方の方法を適切に使用すると、コードの可読性とパフォーマンスが向上します。

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

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