はじめに

前回の記事の続きです。
前回の記事はこちら

struct型

struct

構造体ですね。
Go では class がない代わりに構造体でごにょごにょするようです。

1
2
3
4
type person struct {
    name string
    age int
}

構造体自体は、C言語とほとんど変わらないように見えます

structの匿名フィールド

上でstructをどのように定義するかご紹介しました。
定義する際はフィールド名とその型が一つ一つ対応しています。
実はGoは型だけの定義もサポートしています。これはフィールド名を書かない方法ではなく、匿名フィールドです。
組み込>みフィールドとも呼ばれます。

フィールド名書かないでフィールドが宣言できるのですね。
2つの構造体を宣言して、Student のほうが Human という匿名フィールドを持っていますね。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
type Human struct {
    name string
    age int
    weight int
}

type Student struct {
    Human  // 匿名フィールド、デフォルトでStudentはHumanのすべてのフィールドを含むことになります。
    speciality string
}

下記の main 関数で初期化しているようです。(ここまでは普通ですね)

1
2
// 学生を一人初期化します。
mark := Student{Human{"Mark", 25, 120}, "Computer Science"}

markStudent の型なのに、 匿名フィールド Human の内部のフィールドにアクセスできてます。

1
2
3
4
5
// 対応するフィールドにアクセスします。
 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の属性にアクセスする際、
あたかも自分のフィールドであるかのようにアクセスしたのをご覧いただけるかと思います。
そうです。匿名フィールドというのはこういうものです。

なるほど

同じフィールドがある場合

下記のようになるらしいですね。
HumanphoneEmployeephone でかぶっておりますが、アクセスの仕方でどちらにもアクセスできるようです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
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節ずつやっていきます。
しんどいときは近況でごまかします。
次回は オブジェクト指向 の部分を読みます。