ホームページ >バックエンド開発 >Golang >Golang関数のメソッド値とメソッド式の実装方法

Golang関数のメソッド値とメソッド式の実装方法

WBOY
WBOYオリジナル
2023-05-16 20:40:53788ブラウズ

Golang 関数のメソッド値とメソッド式の実装方法

Golang では、関数は第一級市民です。これは、関数は構文的には他の値と同様であり、変数に格納したり、関数に渡したり、関数から返すことができることを意味します。これに加えて、Golang は型の動作を拡張するメソッドも提供します。メソッドは、型に存在し、その型のフィールドとメソッドにアクセスできる特別な関数です。この記事では、Golang関数のメソッド値とメソッド式の実装方法について説明します。

メソッド値とメソッド式

まず、メソッド値とメソッド式について見てみましょう。メソッド値は、レシーバーがバインドされる関数値です。これは通常の関数に似ていますが、関数の定義時に指定されるレシーバーも含まれています。したがって、メソッド値は通常の関数と同じように渡して保存できますが、受信者への参照も保持します。

次は例です:

type Rect struct {
  width, height float64
}

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

func main() {
  r := Rect{3, 4}

  // 获取 Rect 类型的 Area 方法值
  f := r.Area
  // 调用方法值
  fmt.Println(f())
}

上の例では、Rect という名前の型を定義し、それに対して # という名前の型を定義します。 # 方法。この Area メソッド レシーバーは Rect 型であるため、Rect のインスタンスによってのみ呼び出すことができます。 main 関数では、Rect インスタンス r を作成し、その Area メソッド値を取得して # という名前の変数に格納します。 ##ff は関数値であるため、通常の関数のように呼び出すことができますが、r インスタンスへの参照も保持しているため、呼び出されたときに自動的に ## に渡されます。 rメソッド値と同様に、メソッド式はレシーバーにバインドされた関数式です。これはメソッド値に似ていますが、インスタンスに依存せず、インスタンスがない場合でも呼び出すことができます。メソッド式は型名をレシーバーとして使用します。 次に、メソッド式の使用例を示します。

type Rect struct {
  width, height float64
}

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

func main() {
  // 获取 Rect 类型的 Area 方法表达式
  f := Rect.Area
  fmt.Println(f(Rect{3, 4}))
}

上の例では、

Rect.Area

を使用して

Rect

を取得します。 ##Area メソッド式を入力します。メソッド式はインスタンスに依存しないため、Rect インスタンスを直接渡すことができ、呼び出されたときに自動的にレシーバーとして使用されます。 メソッドの実装方法Golang では、メソッドを実装するには、値レシーバーとポインター レシーバーの 2 つの方法があります。値レシーバーはレシーバーとして値をメソッドに渡し、ポインター レシーバーはレシーバーとしてポインターをメソッドに渡します。値レシーバーはメソッド内のフィールドの値をコピーしますが、ポインター レシーバーはフィールドの値をメソッド内で直接変更できるように、レシーバーとしてポインターを渡します。

次に、値レシーバーの使用例を示します。

type Rect struct {
  width, height float64
}

func (r Rect) Scale(factor float64) {
  r.width *= factor
  r.height *= factor
}

func main() {
  r := Rect{3, 4}
  r.Scale(2)
  fmt.Println(r.width, r.height)
}

上の例では、

Scale

という名前の値レシーバー メソッドを定義しました。浮動小数点数

factor

を受け取り、

Rect の幅と高さにそれを乗算します。メソッドが呼び出されると、値レシーバーが使用されているため、r インスタンスの値がメソッドにコピーされ、変更されます。したがって、メソッド内で幅と高さが変更された場合でも、関数の外部で元の値にアクセスできます。 以下は、ポインター レシーバーの使用例です。

type Rect struct {
  width, height float64
}

func (r *Rect) Scale(factor float64) {
  r.width *= factor
  r.height *= factor
}

func main() {
  r := &Rect{3, 4}
  r.Scale(2)
  fmt.Println(r.width, r.height)
}
上の例では、Scale

という名前のポインター レシーバー メソッドを定義しました。浮動小数点数

factor

を受け取り、

Rect の幅と高さにそれを乗算します。メソッドが呼び出されるとき、ポインター レシーバーの使用により、r インスタンスへのポインターがメソッドに渡され、そのフィールドを直接変更できます。したがって、変更された値は関数の外からアクセスすることもできます。 結論Golang 関数のメソッド値とメソッド式は非常に便利で、コードの可読性と再利用性を大幅に向上させることができます。さらに、メソッドを実装するときは、コードの詳細に応じて、値レシーバーを使用するかポインター レシーバーを使用するかを選択する必要があります。以上、Golang関数のメソッド値とメソッド式の実装方法の紹介でしたので、開発作業の参考になれば幸いです。

以上がGolang関数のメソッド値とメソッド式の実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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