Go超入門コース#13 構造体

はじめに

こんにちは。キノコードです。
「Go超入門コース#13 構造体」について説明します。

構造体とは?

まず構造体について説明します。
構造体とは、異なるデータ型の変数を1つにまとめたものになります。
つまり、構造体には、整数型や文字列型などの異なるデータ型の変数を、1つにまとめることができます。
構造体を作ることを「構造体を定義する」といいます。

フィールド

構造体の中に定義した変数のことをフィールドといいます。
構造体にフィールドを追加することを「フィールドを定義する」といいます。
フィールドは、変数と同じように、数値や文字列を代入したり、参照したりすることができます。

構造体の定義方法

構造体を定義する方法についてみていきましょう。
まず、typeと記述します。
次に、構造体の名前、つまり、構造体名を記述します。
そして、最後にstructと記述して、波括弧。これで構造体の定義は終わりです。
波括弧の中にフィールドを記述します。
それでは、実際にコードを書いて構造体を定義していきましょう。

package main

import "fmt"

type Student struct {
}

func main() {        
}

どんな構造体を定義するか説明します。
構造体名はStudentとして、生徒の名前を格納するnameというフィールドと、数学と英語の点数を格納するmathとenglishというフィールドを定義します。
まずtypeと書いて、次に構造体名を書きます。
今回はStudentという構造体名なので、Student。
次にstructと書き、波括弧を記述します。
これでStudentの構造体の定義は終わりです。

フィールドを定義

次にフィールドを定義しましょう
生徒の名前を格納するnameというフィールドを定義していきましょう。
nameには、佐藤さん、鈴木さんといったような名前をを代入したいので、String型です。

package main

import "fmt"

type Student struct {
        name string
}

func main() {

}

次に、数学と英語の点数を格納するmathとenglishというフィールドを定義します。
mathとenglish書いて、小数点を扱えるfloat型としましょう。
これでフィールドの定義は完了です。
ちなみに、フィールドは変数と同じように、カンマで区切って一括して定義することができます。

package main

import "fmt"

type Student struct {
        name string
        math float64
        english float64
}

func main() {        
}

このようにカンマで区切ればオッケーです。

package main

import "fmt"

type Student struct {
        name string
        math,english float64
}

func main() {        
}

構造体の使い方

フィールドには、変数と同じように、数値や文字列を代入したり、参照したりすることができるとこのレッスンの最初で説明しました。
代入と参照をやってみましょう。
構造体の使い方は、変数の使い方と似ています。
レッスン6で説明した、変数の使い方を簡単に復習しましょう。

package main

import "fmt"

type Student struct {
        name string
        math,english float64
}

func main() {
        var num int

}

レッスン6では、int型のnumという変数を定義して、numに1を代入。それを表示させる記述をしました。
変数の定義の方法は、varと書いて、変数名のnum。その次にデータ型のintを記述しました。

package main

import "fmt"

type Student struct {
        name string
        math,english float64
}

func main() {
        var s Student

}

構造体も変数と同じで、予約語のvarから始めます。
次に、構造体を代入する変数を記述します。
変数名をsとしましょう。
変数のあとは、構造体名を記述します。
構造体のStudentを使えるようにするので、Studentと記述します。
これで構造体が使えるようになりました。
構造体を使えるようにすることを構造体を初期化するといいます。

package main

import "fmt"

type Student struct {
        name string
        math,english float64
}

func main() {
        var s Student
        s.name = "sato"
        s.math = 80
        s.english = 70

        fmt.Println(s)
}

構造体への値の代入方法は、構造体が代入された変数、ドット、フィールド名です。
nameにsato、mathに80、englishに70を代入してみましょう。
また、printlnでsを表示させてみましょう。
実行してみます。
sato,80,70が表示されました。
Go言語の構造体には、構造体を初期化する方法がいくつかあります。
ここではもう1つの初期化の方法を説明します。
初期化と同時に、フィールドに値を代入する方法をみていきましょう。

package main

import "fmt"

type Student struct {
        name string
        math,english float64
}

func main() {
        s := Student{"sato", 80, 70}
        fmt.Println(s)
}

変数と同じようにシンプルに記述することもできます。
コロン、イコール、波括弧で代入できます。
実行してみます。
sato,80,70が表示されました。
しかし、この記述だと、フィールドの上からの順番通りに値を代入しなければなりません。

package main

import "fmt"

type Student struct {
        name string
        math,english float64
}

func main() {
        s := Student{80, "sato", 70}
        fmt.Println(s)
}

したがって、順番を入れ替えてデータ型があわなければエラーになります。
実行してみます。
エラーになりました。

package main

import "fmt"

type Student struct {
        name string
        math,english float64
}

func main() {
        s := Student{"sato", , 70}
        fmt.Println(st)
}

また、一部のフィールドにのみ値を代入することができません。
80の部分を空欄にします。
実行してみます。
エラーになります。
順番を入れ替えたい、一部のフィールドにのみ値を代入するには、フィールド名を指定して代入する方法を使えばよいです。


package main

import "fmt"

type Student struct {
        name string
        math,english float64
}

func main() {
        s := Student{name: "sato", math: 80, english: 70}
        fmt.Println(s)
}

フィールド名のあとにコロン。代入する値を記述します。
実行してみます。
エラーにならず、sato,80,70が表示されました。


package main

import "fmt"

type Student struct {
        name string
        math,english float64
}

func main() {
        s := Student{english: 70}
        fmt.Println(s)
}

確認問題

それでは確認問題です。
このレッスンでは、構造体の初期化の方法を2つ紹介しました。
その2つの方法を使って、構造体を初期化してみてください。
Userという構造体にgenderという文字列を代入するフィールドと、ageという年齢を代入するフィールドを定義してください。
genderにはmale、ageには20という整数を代入してください。
そしてそれらを表示させてください。
動画をとめて記述してみてください。
それでは正解です。


package main

import "fmt"

type User struct {
        gender string
        age    int
}

func main() {
        u := User{"male", 20}

        fmt.Println(u)
}

もう1つの初期化の方法です。
コロンイコールのあとに構造体名。
波括弧の中にフィールドに代入する値を記述します。
実行してみます。maleと20が表示されました。


package main

import "fmt"

type User struct {
        gender string
        age    int
}

func main() {
        u := User{gender: "male", age: 20}

        fmt.Println(u)
}

ちなみにフィールド名を指定して代入する方法もあります。
実行してみます。maleと20が表示されました。