1. ホーム
  2. スクリプト・コラム
  3. ゴラン

Go言語 構造体とメソッドの基本構文

2022-02-15 22:53:59

構造体はさまざまな種類のデータを保持するために使用され、その動作はメソッドの形で宣言することができます。この記事では、go言語における構造体とメソッド、およびquot;継承がどのように実装されているかを紹介します。

構造体の種類

構造体型(struct)は、go言語におけるオブジェクト指向プログラミングの重要なツールとして、重要な位置を占めています。goにはクラスの概念がないため、構造体を用いて同様の機能を実現することが可能です。.

構造体の宣言と定義

// Define the name Person struct using the keywords type and struct
type Robot struct {
	name string
	height int
height int }

初期化と代入。

// Declare by var
var r1 Robot
r1.name = "Optimus Prime"

// Literal direct assignment
r2 := Robot{name: "Optimus Prime"}
r3 := Robot{"Optimus Prime", 100} // If the field names are not added, the values must be given in the order in which they are defined

// new function
r4 := new(Robot)
r4.name = "Optimus Prime"
// or
r5 := &Robot{}
r5.name = r1.name

メソッド

goの関数とメソッドには違いがあります。メソッドには名前が必要で、メソッド宣言のレシーバ宣言で定義された型に属さなければなりません。

受信者宣言は、キーワード func とメソッド名の間を括弧で囲み、正確な名前と型リテラルを記述する必要があります。

  • 型は、現在のメソッドが属する型です。
  • 名前は、現在のメソッドで、それが属する型の値を参照するために使用されます。
package main

import "fmt"

type Robot struct {
	name string
	height int
height int }

func (r Robot) String() string{	
	return fmt.Sprintf("name: %s, height: %d",r.name, r.height)
}

func main() {
    r1 := Robot{name: "Optimus Prime", height: 100}
	fmt.Println(r1) // result: name: Optimus Prime, height: 100
}

String() メソッドの受信者宣言から、Robot 型に属していることがわかり、受信者名は r となっています。

構造体インライン化: "継承" と "オーバーライド"。

Goには継承の概念がありません。その理由と考え方は、以下の公式ウェブサイトをご覧ください。 なぜ型継承がないのですか?

go言語では、フィールドを埋め込むことで継承のような効果を得ることができます。以下のコードをご覧ください。

package main

import "fmt"

type Skills struct {
	speak string 
}

func (s Skills) Speak() {
	fmt.Println(s.speak)	
}

type Robot struct {
	name string // Name
	height int // height
	Skills
skills }

func main() {
	skill := Skills{speak: "hello ! "}
	skill.Speak()
	
	robot := Robot{
		name: "Optimus Prime",
		Skills: skill,
	}
	robot.Speak()
}

埋め込みフィールドのメソッドコレクションは、埋め込まれている型のメソッドコレクションにマージされます。上のコードでは robot.Speak() は、Skillsを継承したSpeak()メソッドと同様に、埋め込みフィールドSkillsのSpeak()メソッドを呼び出します。実装の結果は以下のようになります。

hello !
こんにちは

以下にRobot型のSpeak()メソッドを追加します。

func (r Robot) Speak() {	
	fmt.Printf("My name is %s, ",r.name)
	r.Skills.Speak()
}

では、どのSpeak()メソッドが再び実行されるのでしょうか?答えは、Robot型のSpeak()メソッドです。埋め込みフィールドのSkillsのSpeak()メソッドはquot;masked"、つまり、メソッドのオーバーライドと同様に埋め込み型のメソッドが同名の埋め込みフィールドのメソッドをオーバーライドしています。

その結果

hello !
私の名前はオプティマス・プライム、こんにちは !

フィールドやメソッドは、選択式を連鎖させることで埋め込みフィールドに選択することができます。 r.Skills.Speak() これは、埋め込みフィールドSkillsのSpeak()メソッドを呼び出すものです。

要約

Goはオブジェクト指向プログラミングをサポートしていますが、継承を持たないことに注意してください。フィールドを埋め込むことで継承に似た機能を実装することができ、多重継承よりもすっきりとした組み合わせが可能です。

Go言語の基本構文である構造体とメソッドについての説明は以上となります。Goの構造体とメソッドの詳細については、スクリプトハウスの過去記事を検索するか、以下の記事を引き続きご覧ください。