Go
slice
TECOTECDay 14

Goを初めてみたがSliceの壁に激突したので調べてみた

More than 1 year has passed since last update.

きっかけ

vimconf2017に参加したり、使える幅が増えたGo言語に興味を持ち始め
昔に作ったツールを移植しようと a tour of go を始めてみる

しかしSliceというものの理解に追いつかずぶつかる

そこでの気づきを残す事にした

まず、正直な所そこで勉強をやめそうになる

他の言語がある程度使えると、今目の前の新しい言語への壁を乗り越えなくても作りたいものは実装できてしまう。

「まぁ ちょっと勉強する時間ないし今回は使える言語のリファクタでいいか・・・」
となりそうになる・・・

そうなると

新しい言語の学習が遅れて、考え方などが古くなっていく

新しい言語や新しいバージョンには新しい考え方、より時代に即した考え方が導入されていることが多いと思う

昔話だけで流行りの言語がさっぱり分からなくないおじさんになりそう

を自覚したので前に進むべく勉強してみた。

個人的な考えに

分かっている人にはなかなか分からない人の気持ちが分からないので分からないうちから書いておく!!

という思いがあるのであえて
誰かの参考になったらいいなと・・・

Goをはじめる

https://go-tour-jp.appspot.com/
を知り合いに進められて始めました :writing_hand:
もともとポインタの理解もあったのでそこそこ順調に進んだと思っていましたが

スライス

https://go-tour-jp.appspot.com/moretypes/8
で激突:boom:

| スライスは配列への参照のようなものです

names := [4]string{
    "John",
    "Paul",
    "George",
    "Ringo",
}
fmt.Println(names)

まだSliceでもなく、ここまでは納得・・・

a := names[0:2]
b := names[1:3]
fmt.Println(a, b)

ここが謎

え?なにが分からないの?

a := names[0:2]
a := names[1:3]
は第一引数はindexだと思うが第二引数が何を表してるのが分からず
names[1:3]の3はcapacityなら3つ要素が入るのでは?
なんで 0:2, 1:3の指定で入る要素数が一緒なんだろう
(indexのデータからcapacity分入れるものと思ってた)

色々なサイトを見てみたが

そういうもの風に書いてあるのが多かったので

「そもそも公式のリファレンスを読もうよ・・・」と心の声が聞こえる

で、たどり着いたのがこちら

スライス
次の形式は文字列、配列、配列へのポインタ、スライスのいずれかであるaをスライスする基本式です。
a[low : high]
部分文字列またスライスが作成されます。結果として得たい要素をインデックス式のlowとhighで指定します。得られる結果は0から始まるインデックスを持ち、長さはhigh – lowになります。次の例は配列aをスライスしています。

長さはhigh-lowになります
これがそういう仕様なんだなと意外とすんなりスっと入ってしてしまった

勝手に
a[offset : capacity]
でoffetの位置からcapacityの最大まで入ると勘違いしていたので
a[low : high]

で理由はわかったので一旦Goの前に進もうと思う

けどもう少し調べたら以下のサイトがわかりやすかったです。

他に学習の役に立つような情報サイト

https://www.slideshare.net/yasi_life/go-14075425


結局

新しい言語や新しい考え方を学ぶ際にはプログラムを何年やっててもぶつかる事は必ずあるものだと思います。
今、勉強し始めた方が特別なわけではないので

  • 自分で手を動かして実装してみる
  • インターネットで検索して調べる
  • ドキュメントを読む
  • 自分の理解が先入観による思い込みじゃないか振り返る

のバランスの良さが学習効率には大事だなと再認識しました。

:dancer::dancer_tone1::dancer_tone2::dancer_tone3::dancer_tone4::dancer_tone5: