ホームページ >バックエンド開発 >Golang >golang が構造型のメソッドを定義する方法

golang が構造型のメソッドを定義する方法

PHPz
PHPzオリジナル
2023-04-05 09:09:45872ブラウズ

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 サイトの他の関連記事を参照してください。

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