#あいさつ
Masayuki.です。本記事が初投稿になります。
今年(令和2年)の3月から新米プログラマになり、約2ヶ月半が経過しました。
本当にあっという間だった。。。
まだ入社して日が浅く、社内で一人前になるために日々の学習は怠れません。なにも学習しなかった日の夜には身体が痒くなるレベルになってしまいました←
せっかく日々取り組んでいることがあるので、その備忘録をqiita記事に残すことで、ここにいる誰かの役に立てればと考えています。
今日はGoのfor文についてです。
Q1 . 以下のスライスから一番小さい数を探して出力するコードを書いてください
l := []int{100, 300, 23, 11, 23, 2, 4, 6, 4}
これはGoを独習で学び始めようと、やってみたカリキュラムの中で出題された問題です。
入社当時、これを見たときは
…?
となんのこっちゃわからず…
3分ぐらい考えた後に回答例を見ました。
func main() {
l := []int{100, 300, 23, 11, 23, 2, 4, 6, 4}
var min int
for i, num := range l {
if i == 0 {
min = num
continue
}
if min >= num {
min = num
}
}
fmt.Println(min) //2が出力される。
}
...ん?なんで2が最小値だってわかったの?なにが起こったの?
恥ずかしながら、これが腹落ちするようになるまで私はかなりの時間を要してしまいました。
ポイントとして、このfor構文にはif文が2つあって、最初のif文
for i, num := range l {
if i == 0 {
min = num
continue
}
ここは処理が一回しか走らないということなんですね。
この辺を理解するには、スライスの概念を理解しておく必要があります。
簡単に説明すると、配列はあくまでも複数の要素を持った値なのに対し、スライスは配列の一部または全部を指し示す参照型のデータです。
例えば
a := [5]int{2, 10, 8, 15, 4}
[5]という配列にint型の値5つ渡しているのに対し、スライスは
a := []int{1, 3, 5, 7, 9}
[]と、中身は空です。この[]の中に値を追加したり変更したり、コピーできたりします。
今回はfor文についての記事なので詳しいスライスについての説明は割愛します。
※参考までに。
他言語プログラマがgolangの基本を押さえる為のまとめ
とすると、
for i, num := range l
ここのrangeでは、for文の中でlというスライスを取得してきてくれる役割があります。
それを i, num (インデックスと値)としてそれぞれ代入してくれてるんですね。
for i, num := range l {
if i == 0 {
min = num
continue
}
if min >= num {
min = num
}
}
そうすると、上のfor文の処理ではminにはインデックス[0]の値、100が代入されました。
下のfor文の処理では
if min >= num { //もしminがnum以上だったら min = num //minにnumを代入 } }
とすることで、
l := []int{100, 300, 23, 11, 23, 2, 4, 6, 4}
このスライスの値をfor文の繰り返し処理で一つずつ参照していって、numにminよりも小さい値がきたらそれがminに新たに代入されます。最終的には一番小さな値が代入されるはずです。
スライスの値の中で一番小さい値は2ですね。なので最終的には2が出力されます。
以上がこの問題の解説になります。
いかがでしたか?
ちなみに、Golang以外の他言語ではfor文以外にもwhile文とかありますが、Golangではfor文しかありません。シンプルですよね。
#さいごに
業務未経験からGoを学び使えるようになることは、私のように元々RubyやRailsでコードを書いていた駆け出しエンジニアからすると困惑することや躓くポイントが沢山あります。
特にポインタ。
しかし、諦めずに理解できるまで学習に取り組めば必ず成長を感じる機会があります。やはり根気強く継続することは大切ですね。
今後も積極的にしてインプット・アウトプットしていきたいと思います。
最後まで読んでいただき、ありがとうございました!