golang にはクラスがありません。 Golang は純粋なオブジェクト指向プログラミング言語ではなく、クラスの概念も継承もありませんが、オブジェクト指向プログラミングをシミュレートすることもできます。 Go では、struct を他の言語のクラスと比較できます。構造体は、「type person struct {...}」など、オブジェクトのタイプを表すために struct を通じて定義されます。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
オブジェクト指向の 3 つの主要な特徴: カプセル化、継承、ポリモーフィズム。
Go は純粋なオブジェクト指向プログラミング言語ではなく、クラスの概念も継承もありません。ただし、Go はオブジェクト指向プログラミングをシミュレートすることもできます。つまり、構造体を他の言語のクラスと比較することができます。
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 }
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 構造体の名前の最初の文字は小文字にする必要があることに注意してください。
Java には次の 4 つのアクセス権があります:
public | protected |
friend (デフォルト) |
private | |
同じclass | yes | yes | yes | yes |
yes | yes | yes | no | |
yes | yes | no | no | |
#yes | no | いいえ | no |
Go はそれを簡素化し、可視性の最小粒度はパッケージです。言い換えれば、Go にはフレンドリーとパブリックの 2 つのタイプが保持されます。 Go 変数名の最初の文字が小文字の場合は、その変数がパッケージ内で表示されることを意味し、最初の文字が大文字の場合は、どこでも表示されることを意味します。
カプセル化カプセル化には 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
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() }
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 サイトの他の関連記事を参照してください。