しばらくサボってしまいましたが、久しぶりに「A Tour of Go」を進めてみます。
今回の内容は Structs ということで構造体と呼ばれる概念ですね。C言語などにもある概念で、そこではオブジェクト指向でいう Class に近いものなんですが、Go言語ではどんな感じなんでしょうね?
Struct(構造体)とは?
フィールドの集合らしいです。
ここで言うフィールドってのは「変数」や「ポインタ」や「配列」それに「ファンクション」で、これらのグループをまとめたものがStructってことのようです。
Structの言語仕様は下記の通り。
Struct types
A struct is a sequence of named elements, called fields, each of which has a name and a type. Field names may be specified explicitly (IdentifierList) or implicitly (EmbeddedField). Within a struct, non-blank field names must be unique.
StructType = “struct” “{” { FieldDecl “;” } “}” .
FieldDecl = (IdentifierList Type | EmbeddedField) [ Tag ] .
EmbeddedField = [ “*” ] TypeName .
Tag = string_lit .
// An empty struct.
struct {}
// A struct with 6 fields.
struct {
x, y int
u float32
_ float32 // padding
A *[]int
F func()
}
https://golang.org/ref/spec#Struct_types
Structの書き方
基本になる書き方はこんな感じ。
// 構造体の定義
type <構造体の定義名> struct {
<フィールド名> <型>
:
:
}
// 構造体を変数として扱うには
// ※フィールド名を指定しない場合は、定義した順番に引数があてがわれていく
<構造体の変数名> := <構造体の定義名> { <フィールドの値>, … }
// ※フィールド名を指定する場合は順番にとらわれずに書ける
<構造体の変数名> := <構造体の定義名> { <フィールド名>: <フィールドの値>, … }
// フィールドの値を扱うには
<構造体の変数名>.<フィールド名> // 変数名にドット(.)つけてフィールド名を指定する
実際に使ってみる
構造体を実際に使ったサンプルプログラムを作ってみました。
package main
import "fmt"
// モンストのキャラクターを構造体で定義してみる
type Monster struct {
name string // 名前
life int // HP
power int // 攻撃力
speed float64 // スピード
}
func main() {
// 構造体を初期化しつつ変数として扱う
pandora := Monster{ "希望の少女 パンドラ", 22569, 22219, 468.60 }
// フィールド名を指定する場合
// pandora := Monster{ name: "希望の少女 パンドラ", life: 22569, power: 22219, speed: 468.60 }
// 構造体の各フィールドを出力してみる
fmt.Printf("pandora.name 名前 : %s\n", pandora.name)
fmt.Printf("pandora.life HP : %d\n", pandora.life)
fmt.Printf("pandora.power 攻撃力 : %d\n", pandora.power)
fmt.Printf("pandora.speed スピード : %.2f\n", pandora.speed)
}
今回進めたページ
今回は2ページ進行しました。


さいごに
簡単なプログラミングだとあまり使わない構造体ですが、色々なデータを扱う処理などでは便利に使えるはずです。
次回もStructの予定ですが、今度はポインタを使った応用ですね。
コメント