ホームページ  >  記事  >  バックエンド開発  >  golangにクラスはありますか?

golangにクラスはありますか?

青灯夜游
青灯夜游オリジナル
2023-01-12 16:56:043905ブラウズ

golang にはクラスがありません。 Golang は純粋なオブジェクト指向プログラミング言語ではなく、クラスの概念も継承もありませんが、オブジェクト指向プログラミングをシミュレートすることもできます。 Go では、struct を他の言語のクラスと比較できます。構造体は、「type person struct {...}」など、オブジェクトのタイプを表すために struct を通じて定義されます。

golangにクラスはありますか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

オブジェクト指向の 3 つの主要な特徴: カプセル化、継承、ポリモーフィズム。

Go は純粋なオブジェクト指向プログラミング言語ではなく、クラスの概念も継承もありません。ただし、Go はオブジェクト指向プログラミングをシミュレートすることもできます。つまり、構造体を他の言語のクラスと比較することができます。

Object

Go にはクラスの概念がなく、オブジェクトの型を表す構造体を struct で定義します。

type person struct {
	Age  int
	Name string
}

オブジェクトは状態と動作の有機体です。たとえば、次の Java コード:

public class Person {

    int age;

    String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Java とは異なり、Go のメソッドはクラス定義内のクラス データにバインドする必要はなく、 同じパッケージ内で定義する必要があるだけです 。これは、Go を初めて使用する学生にとっては奇妙に見えるかもしれません。

type person struct {
	Age  int
	Name string
}

func (p *person) GetAge() int {
	return p.Age
}

func (p *person) SetAge(age int)  {
	p.Age = age
}

func (p *person) GetName() string {
	return p.Name
}

func (p *person) SetName(name string) {
	p.Name = name
}

Constructor

Go にはコンストラクターがなく、オブジェクトのデータ キャリアは構造体です。 Java はコンストラクターをサポートしています。コンストラクターの名前はクラス名と同じです。複数のコンストラクターは関数のオーバーロードによって実装されます。

Go コンストラクターは、ファクトリ関数を通じてシミュレートされます。例は次のとおりです。

type person struct {
	Age  int
	Name string
}

/**
	构造函数1--通过名字初始化
 */
func newPersonByName(name string) *person {
	return &person{
		Name: name,
	}
}

/**
	构造函数2--通过年龄初始化
 */
func newPersonByAge(age int) *person {
	return &person{
		Age: age,
	}
}

シミュレートされたコンストラクターの外部直接バイパスを避けるために、person 構造体の名前の最初の文字は小文字にする必要があることに注意してください。

Access権限

Java には次の 4 つのアクセス権があります:

##同じパッケージyes yesyesnoBao のさまざまなサブクラスyesyes nono別のパッケージ非サブクラス
Java アクセス制御文字
public protected

friend

(デフォルト)

private
同じclass yes yes yes yes
#yes no いいえ no

Go はそれを簡素化し、可視性の最小粒度はパッケージです。言い換えれば、Go にはフレンドリーとパブリックの 2 つのタイプが保持されます。 Go 変数名の最初の文字が小文字の場合は、その変数がパッケージ内で表示されることを意味し、最初の文字が大文字の場合は、どこでも表示されることを意味します。

カプセル化

カプセル化は、抽象化された構造を、構造内のデータを操作する関数とバインドします。外部プログラムは、エクスポートされた関数 API (パブリック メソッド) に従って構造体の内部状態のみを変更できます。

カプセル化には 2 つの利点があります:

隠れた実装: ユーザーが内部ロジックを理解せずに構造の内部状態を操作するために API を直接使用することだけを望みます。氷山のように、私たちは水の上の部分しか見えません。

データの保護: データの変更やアクセスに対してセキュリティ対策を講じることができます。setter メソッドを呼び出すときはパラメーターを確認でき、getter メソッドを呼び出すときはアクセス ログを追加できます。

簡単な Bean 定義は次のとおりです:

type person struct {
	Age  int
	Name string
}

func NewPerson(age int, name string) *person{
	return &person{age, name}
}

func (p *person) SetAge(age int)  {
	p.Age = age
}

func (p *person) SetName(name string) {
	p.Name = name
}

func main() {
	p:= NewPerson(10, "Lily")
	p.SetName("Lucy")
	p.SetAge(18)
}

Go のメソッドは特別な関数であり、コンパイラの単なる構文糖衣の一種であることに注意してください。 look 関数の最初のパラメータとしてオブジェクトへの参照を渡すのに役立ちます。たとえば、次のコードは

func main() {
	p:= NewPerson(10, "Lily")

	p.SetName("Lily1")
	// 等价于下面的写法
	// p是一个引用,函数引用
	setNameFunc := (*person).SetName
	setNameFunc(p, "Lily2")
	fmt.Println(p.Name)
}

inheritance

inheritance と同等です。サブクラスが親クラスを継承すると、親クラスの特性と動作が取得されます。 。継承の主な目的は、コードを再利用することです。コードを再利用するための Java の 2 つの主要なツールは、継承と合成です。

Go にはクラスの概念がなく、継承もありません。しかし、Go は匿名構成を通じて継承をシミュレートできます。

以下に示すように、Cat は Animal 構造体を匿名で集約することにより、Animal の move() メソッドと Shout() メソッドを自動的に取得します。 、基本クラスとして宣言された変数は、実行時に異なるサブクラスを指し、異なるサブクラスのメソッドを呼び出すことができます。ポリモーフィズムの目的は均一性を達成することです。

インターフェースを通じてポリモーフィズムを実装します。 Java では、インターフェイスを通じてインターフェイスを定義し、インプルメントを通じてインターフェイスを実装します。

type Animal struct {
	Name string
}

func (Animal) move()  {
	fmt.Println("我会走")
}

func (Animal) shout()  {
	fmt.Println("我会叫")
}

type Cat struct {
	Animal // 匿名聚合
}

func main() {
	cat := &Cat{Animal{"猫"}}

	cat.move()
	cat.shout()
}

Go は、duck type を通じて、オブジェクトがアヒルのように見え、アヒルのように鳴く限り、それはアヒルであると推論します。つまり、Go のインターフェースは比較的隠蔽されており、オブジェクトがそのインターフェースで宣言されたすべてのメソッドを実装している限り、そのオブジェクトはそのインターフェースに属していると見なされます。

interface Animal {

    void move();

    void shout();
}

class Dog implements Animal {

    @Override
    public void move() {
        System.out.println("我会走");
    }

    @Override
    public void shout() {
        System.out.println("我会叫");
    }
}

【関連する推奨事項:

Go ビデオ チュートリアル

プログラミング教育

]

以上がgolangにクラスはありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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