#構造体
構造体とは、自分で考えて属性を定義できるデータ型のことをいいます。struct
というデータ型を用いり、type 構造体名 struct
で定義します。構造体名は小文字で始めてもいいのですが、大きなプロジェクトのプログラムでは基本頭文字を大文字にしているので、ここでは大文字で記述しました。構造体の中では属性を指定でき、GOでは属性をフィールド
と呼びます。下記コードでは、length(全長)
,group(種類)
,name(名前)
が各フィールド名になります。構造体の定義はフィールド名とデータ型を示すもので、データはフィールドに値を与えて作成します。名前を「アジ」にし、種目に「スズキ目」、全長が「20cm」の魚のデータを作成して変数sea
(海の魚なので)に代入してあります。このように決められた構造に従って組み立てたデータをインスタンスと呼びます。構造体FIshのインスタンスsea
でまとめるとわかりやすいでしょう。フィールドに値を与えてインスタンスを作成したわけですが、Fishインスタンスsea,river,lake
を作成して要素とする配列のスライスfishs
を定義し、そのfishs
の要素fishs[i]
の後に構造体Fish
のフィールド名fishs[i].group
, fishs[i].name
を書くとフィールドの値が取り出せます。
package main
import "fmt"
type Fish struct {
name string
group string
length int
}
func main() {
sea := Fish{"アジ", "スズキ目", 20}
river := Fish{"アユ", "キュウリウオ目", 15}
lake := Fish{"フナ", "コイ目", 40}
fishs := []Fish{sea, river, lake}
for i := 0; i < len(fishs); i++ {
fmt.Printf("%sの%sになります\n", fishs[i].group, fishs[i].name)
}
}
##ビルドして実行
スズキ目のアジになります
キュウリウオ目のアユになります
コイ目のフナになります
#構造体のインスタンスを引数にとる関数
構造体のインスタンスを関数の引数にしてみます。bigger関数を定義しFish
のインスタンスを2つ引数にとり、そのlength
フィールドの値を比較してみます。両者の差が±5
以内であれば、同じ大きさとみなします。main関数の中にあるfor文をbigger関数を使った記述に変更し、スライスfishs
が見ている配列のある要素をbigger関数の引数に与えます。配列の最後の要素は次の要素(next)として配列の最初の要素をあてます。
package main
import "fmt"
type Fish struct {
name string
group string
length int
}
func bigger(f1 Fish, f2 Fish) string {
fiff := f1.length - f2.length
switch {
case fiff > 5:
return "より大きい"
case fiff < -5:
return "より小さい"
default:
return "と同じ大きさ"
}
}
func main() {
sea := Fish{"アジ", "スズキ目", 20}
river := Fish{"アユ", "キュウリウオ目", 15}
lake := Fish{"フナ", "コイ目", 40}
fishs := []Fish{sea, river, lake}
for i := 0; i < len(fishs); i++ {
next := i + 1
if next >= len(fishs) {
next = 0
}
fmt.Printf("%sは%s%sです\n", fishs[i].name, fishs[next].name, bigger(fishs[i], fishs[next]))
}
}
##ビルドして実行
アジはアユと同じ大きさです
アユはフナより小さいです
フナはアジより大きいです
#構造体のインスタンスを戻り値とする関数
上記、bigger関数では2つの要素を比較しましたが、今度は一番大きな要素を戻すbiggest関数に書き換えてプログラムを構成していきます。biggest関数は、引数にFish
のインスタンスの配列のスライスを取り、フィールドlength
の値が最大の要素を戻します。戻り値の型はFish
インスタンスになります。main関数の中では、biggest
の引数にfishs
を渡し、戻り値のFish
インスタンスを受け取ってフィールドname
の値を取り出しています。
package main
import "fmt"
type Fish struct {
name string
group string
length int
}
func biggest(fishs []Fish) Fish {
biggest := fishs[0]
for i := 1; i < len(fishs); i++ {
if fishs[i].length > biggest.length {
biggest = fishs[i]
}
}
return biggest
}
func main() {
sea := Fish{"アジ", "スズキ目", 20}
river := Fish{"アユ", "キュウリウオ目", 15}
lake := Fish{"フナ", "コイ目", 40}
fishs := []Fish{sea, river, lake}
fmt.Printf("%sが最大です\n", biggest(fishs).name)
}
##再度ビルドして実行
フナが最大です
###※皆様、本記事を最後までお読み頂きありがとうございました。私は、GO言語を学ぶにあたってある一冊の本にとても支えられ、ここまで覚えることが出来ました。プログラミングを早く上達させるには、読むだけではなく実際にコードを書き出して、どんどん覚えたことをアウトプット(出力)して行けば、より早く上達できると身をもって感じました。この後に続く実践・応用編は、実際に参考にさせて頂いた著書をご覧になって学習して頂きたいと思います。本来であれば、もっと技術的な記事を配信していかなければならないQiita
を今回こういう形で利用させて頂きましたが、この記事をご覧になられた初学者の方々への励みになれば幸いです。