はじめに
前回の記事の続きです。
前回の記事はこちら
struct型
struct
構造体ですね。Go
では class
がない代わりに構造体でごにょごにょするようです。
例
type person struct {
name string
age int
}
構造体自体は、C言語とほとんど変わらないように見えます
structの匿名フィールド
上でstructをどのように定義するかご紹介しました。
定義する際はフィールド名とその型が一つ一つ対応しています。
実はGoは型だけの定義もサポートしています。これはフィールド名を書かない方法ではなく、匿名フィールドです。
組み込>みフィールドとも呼ばれます。
フィールド名書かないでフィールドが宣言できるのですね。
2つの構造体を宣言して、Student
のほうが Human
という匿名フィールドを持っていますね。
type Human struct {
name string
age int
weight int
}
type Student struct {
Human // 匿名フィールド、デフォルトでStudentはHumanのすべてのフィールドを含むことになります。
speciality string
}
下記の main
関数で初期化しているようです。(ここまでは普通ですね)
// 学生を一人初期化します。
mark := Student{Human{"Mark", 25, 120}, "Computer Science"}
mark
は Student
の型なのに、 匿名フィールド Human
の内部のフィールドにアクセスできてます。
// 対応するフィールドにアクセスします。
fmt.Println("His name is ", mark.name)
fmt.Println("His age is ", mark.age)
fmt.Println("His weight is ", mark.weight)
fmt.Println("His speciality is ", mark.speciality)
これが匿名フィールドの特徴っぽいですね。
Studentがageとnameの属性にアクセスする際、
あたかも自分のフィールドであるかのようにアクセスしたのをご覧いただけるかと思います。
そうです。匿名フィールドというのはこういうものです。
なるほど
同じフィールドがある場合
下記のようになるらしいですね。Human
のphone
と Employee
の phone
でかぶっておりますが、アクセスの仕方でどちらにもアクセスできるようです。
package main
import "fmt"
type Human struct {
name string
age int
phone string // Human型がもつフィールド
}
type Employee struct {
Human // 匿名フィールドHuman
speciality string
phone string // 社員のphoneフィールド
}
func main() {
Bob := Employee{Human{"Bob", 34, "777-444-XXXX"}, "Designer", "333-222"}
fmt.Println("Bob's work phone is:", Bob.phone)
// もし我々がHumanのphoneフィールドにアクセスする場合は
fmt.Println("Bob's personal phone is:", Bob.Human.phone)
}
おわりに
平日なので1節ずつやっていきます。
しんどいときは近況でごまかします。
次回は オブジェクト指向
の部分を読みます。