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
メソッド値を取得して # という名前の変数に格納します。 ##f。
f は関数値であるため、通常の関数のように呼び出すことができますが、
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 サイトの他の関連記事を参照してください。