
Go言語に構造体というデータ型があるらしいんですが…定義方法がわからなくて…
Go言語の構造体の定義方法についてお伝えしていきます。
構造体と聞くと何だか難しそうなイメージが湧きますが、実はそんなことはなくて知ると便利な機能だということを感じていただけるでしょう。
ただ、覚えることも多いので、少しづつ進んでいきます。
よろしくお願いいたします。
構造体とは?
まずは構造体とは何なのでしょう?
構造体についての説明を引用させていただきます。
構造体(こうぞうたい、英: 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() {
}
イラストはこんな感じで構造体として定義できます。

ただ、プログラムサンプルとして活用できないのでこれまで!
構造体の操作の前に知っておきたいこと
このあと構造体の初期化をプログラムで確認します。
その前に、構造体の変数定義とフィールドへのアクセス方法を理解しておきましょう。
構造体の変数定義
構造体の変数定義は下記の記述になります。
フィールドへのアクセス方法
構造体のへのフィールドにアクセスするには、下記の記述になります。
構造体を初期化しよう
構造体の初期化はいくつかの方法があるので、それぞれ確認していきます。
構造体初期化前の値を確認する
今回のサンプルはサイトデータを構造体として定義していきます。
// 構造体初期化前の値を確認
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 型
}
以上です。
今回、お伝えした内容は構造体の基本中の基本です。
ですから、しっかりと理解しておきましょう。
comment