LoginSignup
0
0

More than 3 years have passed since last update.

プログラミング超入門(Final)〜GO言語〜

Posted at

構造体

構造体とは、自分で考えて属性を定義できるデータ型のことをいいます。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を今回こういう形で利用させて頂きましたが、この記事をご覧になられた初学者の方々への励みになれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0