検索
ホームページバックエンド開発Golanggolangにクラスはありますか?

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

Jan 12, 2023 pm 04:56 PM
golang言語を移動親切

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 までご連絡ください。
init機能と副作用:初期化と保守性のバランスinit機能と副作用:初期化と保守性のバランスApr 26, 2025 am 12:23 AM

抑制性を促進するために、抑制可能:1)エフェクスを最小化することを最小化します

ゴーを始めましょう:初心者のガイドゴーを始めましょう:初心者のガイドApr 26, 2025 am 12:21 AM

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

並行性パターン:開発者のベストプラクティス並行性パターン:開発者のベストプラクティスApr 26, 2025 am 12:20 AM

開発者は、次のベストプラクティスに従う必要があります。1。ゴルチンを慎重に管理して、リソースの漏れを防ぎます。 2。同期にチャネルを使用しますが、過剰使用を避けます。 3。同時プログラムのエラーを明示的に処理します。 4. GomaxProcsを理解して、パフォーマンスを最適化します。これらのプラクティスは、リソースの効果的な管理、適切な同期の実装、適切なエラー処理、パフォーマンスの最適化を確保し、それによりソフトウェアの効率と保守性を向上させるため、効率的で堅牢なソフトウェア開発には重要です。

生産に進む:現実世界のユースケースと例生産に進む:現実世界のユースケースと例Apr 26, 2025 am 12:18 AM

goexcelsinproductionduetoitsperformanceandsimplicity、butrequirescarefulmanagement of sscalability、errorhandling、andresources.1)dockerusesgofores goforesesgorusesgolusesgotainermanagement.2)uberscalesmicroserviceswithgo、facingchallengesinservicememameme

GOのカスタムエラータイプ:詳細なエラー情報を提供しますGOのカスタムエラータイプ:詳細なエラー情報を提供しますApr 26, 2025 am 12:09 AM

標準のエラーインターフェイスが限られた情報を提供し、カスタムタイプがコンテキストと構造化された情報を追加できるため、エラータイプをカスタマイズする必要があります。 1)カスタムエラータイプには、エラーコード、場所、コンテキストデータなどを含めることができます。2)デバッグ効率とユーザーエクスペリエンスを改善する3)ただし、その複雑さとメンテナンスコストに注意する必要があります。

GOプログラミング言語を備えたスケーラブルなシステムを構築しますGOプログラミング言語を備えたスケーラブルなシステムを構築しますApr 25, 2025 am 12:19 AM

goisidealforbuildingscalablessystemsduetoitssimplicity、効率性、およびビルド・インコンカレンシsupport.1)

GOでINIT機能を効果的に使用するためのベストプラクティスGOでINIT機能を効果的に使用するためのベストプラクティスApr 25, 2025 am 12:18 AM

intionSingOrunautomaticallyは()andareuseforstingupenments andinitializingvariables.usemforsimpletasks、回避効果を回避し、測定可能性を測定することを検討します。

GOパッケージのINIT機能の実行順序GOパッケージのINIT機能の実行順序Apr 25, 2025 am 12:14 AM

goinitializeSpackages intheordertheyareimport extionsitions withinitionsiteintheirdefinition ordord、およびfilenamesdetermineTheOordCrossMultiplefiles.thisprocesccanbeandeanded by -dependenciessedieSiesは、このマイレアドカンフレシニティン化の対象となります

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)