Go触ってます。触ってますというか、ほんとに遊んでるだけです。
来年はGoで何か作るとこのあいだ決めたので、現在その準備中です。
で、まあ準備というか慣れるのも兼ねてProject Eulerを順番に解いてます。
ProjectEulerをご存じの方なら分かっていただけると思うのですが、素数の計算とか数列の扱いとか、この辺をライブラリ化しておきたいこともあります。
もちろん同じ問題内に限り、たった一度計算すれば以降キャッシュから引っ張り出して、みたいな感じで。
ちなみにですが、ぶっつけで解いていってるので、Goの言語仕様自体は正直ろくに知りません。
Effective Goは軽く目を通したものの、とりあえず手を動かせば何とかなるだろ精神で。
分からないところがあれば都度調べる感じでやってます。
ここから本題です。分からないところ、自信ないところの羅列と自分なりの理解です。
偉い人がコメントとかくれたら有益な記事になるかもしれないですけど、それ以外は完全に自分の思考の整理です。
スライス?
これ全然ぴんと来なくて。配列とどう違うの?
var a [10]int = [10]int{} // たぶんこれは要素10の配列
var as []int = a[0:5] // たぶんこれは要素10の配列のスライス
実体として配置されてるものは配列、その部分配列(乱暴な言い方だけど)はスライス、という認識。
だから、例えばas[2] = 2
なんて操作をすると、a
に対しても影響が出る。
ここまで書いてて思ったけど、これCのポインタ的なあれ? 参照型的なあれ? アドレス共有してる?
スライスは参照型です。すなわちスライスを別のスライスに代入したときは、双方が同じ配列を参照します。
たとえば関数がスライスを引数として取るとき、関数内でスライスの要素に変更を加えると、
ポインタ渡しのように関数の呼び元からも変更内容が参照できます。
おお。ちゃんと書いてあった。ちゃんと読め俺。
じゃあ、部分配列は本当に乱暴な言い方で、一部だろうが全部だろうがスライスはスライスか。
ちうことは、
var s []int = make([]int, 10) // これはスライス(Cで言うところのポインタに対してmalloc的な操作?)
var s2 []int = s[0:5] // これはスライスのスライス
var s3 []int = make([]int, 10)[0:5) // これもスライスのスライス。s2と一緒。
スライスのまとめ
- よく使われるのは配列じゃなくてスライス
- スライスは参照型(配列に特化したポインタと理解したほうが早いかもしれない)
- 参照型だから元の配列を破壊するような操作も可能
- 関数に渡すときは大体スライス(利便性もろもろ考えればスライスで渡したほうが楽)
インターフェイス?
いや、概念としては分かります。でもこれ、構造体が持つ関数(メソッド?)のリストですよね、ただの。
これがあるとなにがうれしいのかいまいち掴めない。
使っていればそのうち効果的な使い方を見つけられるのかな。全然わかんないですけど。
あ、例えば、DBにアクセスするための構造体はSelect()
を少なくとも実装してなければならない、みたいなルールを作るとすれば、このインターフェイスの出番ですかね。
よくわかんないですけど。
まとめ
無理やりまとめ。
ほんとはもっといろいろ書こうと思ってたんですけど、書けば書くほどもっとドキュメント読めよと怒号が飛んできそうなのでorz
来年はAdventCalendarあたりに参加できるぐらいを目標に頑張ります。
あ、インターフェイスの使い道はほんとに誰か教えてほしいです。