Go言語 構造体とメソッドの基本構文
構造体はさまざまな種類のデータを保持するために使用され、その動作はメソッドの形で宣言することができます。この記事では、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の構造体とメソッドの詳細については、スクリプトハウスの過去記事を検索するか、以下の記事を引き続きご覧ください。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン