構造体を定義してみよう!Go言語がより便利に

Go言語
この記事は約10分で読めます。
Go初学者
Go初学者

Go言語に構造体というデータ型があるらしいんですが…定義方法がわからなくて…

この記事ではGo言語の構造体の定義を理解できます!
  • 構造体とは?を理解できます
  • 構造体の定義方法を理解できます
  • 構造体を型として扱い、プログラムで確認できます

Go言語の構造体の定義方法についてお伝えしていきます。

構造体と聞くと何だか難しそうなイメージが湧きますが、実はそんなことはなくて知ると便利な機能だということを感じていただけるでしょう。

ただ、覚えることも多いので、少しづつ進んでいきます。

よろしくお願いいたします。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

構造体とは?

まずは構造体とは何なのでしょう?

構造体についての説明を引用させていただきます。

構造体(こうぞうたい、英: structure)はプログラミング言語におけるデータ型の一つで、1つもしくは複数の値をまとめて格納できる型。それぞれのメンバー(フィールド)に名前が付いている点、またメンバーの型が異なっていてもよい点が配列と異なる。

引用元:ウキペディア
もりぴ
もりぴ

難しい文章ですが、この文章をイメージ化したのが次のイラストです!

構造体は違う型の変数(フィールド)をひとつのグループにまとめて、そのグループをとして扱うことができます。

Go言語では変数だけでなく、メソッドや埋め込みといった機能も追加されています。

もりぴ
もりぴ

あとで「チームともだち」で構造体を定義しますよ!

構造体を定義する

構造体の定義は下記のように記述していきます。

// 構造体の定義構成
type 型名 struct{
    フィールド名1 型
    フィールド名2 型
         ・
         ・
         ・
    フィールド名x 型
}

では、簡単にint型とstring型で構造体を定義してみましょう。

// 構造体を定義する
package main

type Sample struct{
    X int
    Y int
    S string
}

func main() {

}

このように構造体を定義すると Sample 型の構造体が定義でき、構造体の中は int型のフィールド2つ と string型のフィールドが1つの構成です。

型が一緒の場合は下記のように定義もできます。

// 構造体を定義する
package main

type Sample struct{
    // 型が一緒の場合はフィールドをまとめることができる
    X, Y int
    S    string
}

func main() {

}
もりぴ
もりぴ

では、「チームともだち」を構造体として定義してみましょう!

// 「チームともだち」の構造体
type Friend struct{
    Hiro   int
    Akira  string
    Makoto float64
    Tomo   bool
}

func main() {

}

イラストはこんな感じで構造体として定義できます。

もりぴ
もりぴ

ただ、プログラムサンプルとして活用できないのでこれまで!

構造体の操作の前に知っておきたいこと

このあと構造体の初期化をプログラムで確認します。

その前に、構造体の変数定義とフィールドへのアクセス方法を理解しておきましょう。

構造体の変数定義

構造体の変数定義は下記の記述になります。

var 変数名 型(型は構造体で設定した型)
または
変数名 := 型{}

フィールドへのアクセス方法

構造体のへのフィールドにアクセスするには、下記の記述になります。

変数名.フィールド名
. を忘れずに!

構造体を初期化しよう

構造体の初期化はいくつかの方法があるので、それぞれ確認していきます。

構造体初期化前の値を確認する

今回のサンプルはサイトデータを構造体として定義していきます。

// 構造体初期化前の値を確認
package main

import "fmt"

// サイトデータを構造体
type SiteData struct{
    Name          string
    URL           string
    Administrator string
    StartYear     int
}

func main() {
    var site1 SiteData
    // 初期化前の値を確認
    fmt.Println(site1)
}
// 出力結果
$ go run main.go 
{   0}

出力結果を見ると、string型の初期値 空文字 とint型の初期値 0 が確認できます。

構造体の初期化前は、型の初期値が代入されることを押さえておきましょう。

変数定義後にフィールドを設定して初期化する

構造体の変数を定義した後に、それぞれのフィールドを設定して初期化します。

// 変数定義後にフィールドを設定して初期化
package main

import "fmt"

// サイトデータを構造体
type SiteData struct {
    Name          string
    URL           string
    Administrator string
    StartYear     int
}

func main() {
    // 変数を定義
    var site1 SiteData

    // フィールドを設定
    site1.URL = "https://golangstart.com/"
    site1.Name = "Golang!Go!!"
    site1.StartYear = 2021
    site1.Administrator = "morip"

    // 値を出力
    fmt.Println(site1)
    // Nameだけ取り出す
    fmt.Println(site1.Name)
}
// 出力結果
$ go run main.go 
{Golang!Go!! https://golangstart.com/ morip 2021}
Golang!Go!!  // Nameだけ取り出した結果

フィールドの設定は順番通りでなくても、構造体で設定したフィールドの順番通りに出力されます。

個別のフィールドを出力する場合は、変数名.フィールド名 で出力できます。

変数宣言と同時に初期化する(フィールド名を指定して)

変数宣言と同時にフィールド名を指定して初期化してみます。

// フィールド名を指定して初期化
package main

import "fmt"

// サイトデータを構造体
type SiteData struct {
    Name          string
    URL           string
    Administrator string
    StartYear     int
}

func main() {
    // 変数宣言と同時に初期化(フィールド名を指定)
    site2 := SiteData{
	URL:           "https://www.google.com/",
	Name:          "Google",
	Administrator: "Google",
    }
    fmt.Println(site2)
}
// 出力結果
$ go run main.go 
{Google https://www.google.com/ Google 0}

フィールド名と値の間に : で繋げて設定していきます。

フィールド名を指定すると、構造体の順番通りに指定しなくても初期化できます。

さらに、今回はサイト開始年を未入力にしましたがエラーにならずに出力されています。

変数宣言と同時に初期化する(フィールド名を指定しない)

フィールド名を指定しないで初期化する場合は、構造体のフィールドの順番と一緒でなければいけません。

// フィールド名を指定しないで初期化
package main

import "fmt"

// サイトデータを構造体
type SiteData struct {
    Name          string
    URL           string
    Administrator string
    StartYear     int
}

func main() {
    // 変数宣言と同時に初期化
    // 構造体のフィールドの順番と一緒
    site3 := SiteData{
	"Yahoo!",
	"https://yahoo.co.jp",
	"Yahoo",
	1996,
    }
    fmt.Println(site3)
}
// 出力結果
$ go run main.go 
{Yahoo! https://yahoo.co.jp Yahoo 1996}

では、フィールドの設定が足りない場合はどうなるのでしょうか?

今回は StartYear をフィールド設定しないで出力してみましょう。

// フィールド名を指定しないで初期化
package main

import "fmt"

// サイトデータを構造体
type SiteData struct {
    Name          string
    URL           string
    Administrator string
    StartYear     int
}

func main() {
    // 変数宣言と同時に初期化
    // 構造体のフィールドの順番と一緒
    site3 := SiteData{
	"Yahoo!",
	"https://yahoo.co.jp",
	"Yahoo",
    }
    fmt.Println(site3)
}
// 出力結果
$ go run main.go 
# command-line-arguments
./main.go:48:56: too few values in SiteData{...}

「値が少なすぎる」というエラーになります。

フィールドの値を変更する

初期化したフィールドの値を変更するには、下記の記述で変更できます。

変数名.フィールド名 = 変更する値
. を忘れずに!

では、プログラムで確認しましょう。

// フィールドの値を変更する
package main

import "fmt"

// サイトデータを構造体
type SiteData struct {
    Name          string
    URL           string
    Administrator string
    StartYear     int
}

func main() {
    var site1 SiteData

    // フィールドを設定
    site1.URL = "https://golangstart.com/"
    site1.Name = "Golang!Go!!"
    site1.StartYear = 2021
    site1.Administrator = "morip"

    // 値を出力
    fmt.Println(site1)

    // フィールドの値を変更する
    site1.Administrator = "もりぴ"
    fmt.Println(site1)
}
// 出力結果
$ go run main.go 
{Golang!Go!! https://golangstart.com/ morip 2021}
{Golang!Go!! https://golangstart.com/ もりぴ 2021}

出力結果から値が変更されたことが確認できます。

【まとめ】Go言語の構造体定義の基本

今回はGo言語の構造体定義の基本をお伝えしてきました。

では、まとめにはいります。

構造体の定義

// 構造体の定義構成
type 型名 struct{
    フィールド名1 型
    フィールド名2 型
         ・
         ・
         ・
    フィールド名x 型
}
この記事で押さえておくこと!
  • 構造体は違う型のフィールドをひとつのグループにまとめて、そのグループを型として扱うことができる
  • 構造体の変数定義 var 変数名 型 または 変数名 := 型{}
  • フィールドへのアクセス方法 変数名.フィールド名
  • 構造体の初期化前は、型の初期値が代入される
  • 構造体の初期化には…
    1. 変数定義後にフィールドを設定して初期化する
    2. フィールド名を指定して変数宣言と同時に初期化する
    3. フィールド名を指定しないで変数宣言と同時に初期化する

以上です。

今回、お伝えした内容は構造体の基本中の基本です。

ですから、しっかりと理解しておきましょう。

comment

タイトルとURLをコピーしました