ゼロから学ぶGo言語プログラミング(8) A Tour of Go 25~33
A Tour of Goの続き。 データ型や構造あたりから。
25.Structs
(また、 type 宣言は皆さんが知っているものです。)
struct というのが、構造を持ったデータのようです。 内容は名前と型を並べたシンプルなものですが、もっと複雑な入れ子なども可能なのでしょうか。 これを定義し、型として扱うための宣言が"type"のように見えます。
type宣言の出てこないスクリプト言語ばかりやってきたため、残念ながら知っていません。 Goで慣れましょう。
26.Struct Fields
type 宣言した structは、以下のように変数で使うようです。
v := Vertex{1, 2} v.X = 4
{}による内容の指定は、名前付きでは出来ないんでしょうか。
ドットシンタックスでのアクセスは、パッケージへのそれと同じですが、実際には何がどう違ってくるのか。
27.Pointers
ポインタ。 Cですこーし触れて以来、概念は理解していても、まともに使った経験がありません。
さらにこの事例では、ポインタを利用するメリットがピンとこない。
func main() { p := Vertex{1, 2} q := &p q.X = 1e9 fmt.Println(p) }
このポインタを通じた間接的なアクセスで、とてもわかりやすくなります。
とあるんですが、なぜp.Xへのアクセスでは分かりにくいのか。 structが持つ、まだ言及の無い性質に関係あるんでしょうか。
28.Struct Literals
structを使って宣言した型Vertexが、変数へ割り当てる際に、リテラルを渡して初期化できることは理解出来ました。 またリテラルを渡す際、"名前: 値" という構文を用いれば、特定のフィールドだけ指定できることや、名前付きの割り当てと名前なしの割り当てが混在できないことも、確認しました。
問題は前項に引き続きポインタで、
q = &Vertex{1, 2} // has type *Vertex
とすることで、初期化したVertexのポインタが直接手に入るのは良いんですが、このメリットが見えません。
29.The new function
golangにはnew()があり、これを使うと"ゼロ初期化"したタイプが手に入る。 タイプと型を分けて考えないと、おかしいのかな。
なんにせよ"ゼロ初期化"は、structが持つfieldを、数値であればゼロ、文字列であれば空っぽといったデータで初期化すること。 newはそういった初期化を行った構造体の、ポインタを返すという感じでしょうか。
またポインタ絡みなので、飲み込み切れていません。
30.Slices
golangでの配列的な構造は、sliceということのようです。
sliceは
p := []string{}
という風に取得でき、{}にはカンマ区切りで値を入れられる。 [] がsliceであることを表し、後ろに型を続け、更にその内容を {} で示す。
ということは、型の混在したsliceはだめということでしょうか。
31.Slicing slices
p := []int{2, 3, 5, 7, 11, 13} fmt.Println("p[1:4] ==", p[1:4])
こういった書き方で、"p[1:4] == [3 5 7]"が出力されるのは理解できます。 しかし解説がしっくりこない。
sliceは、同じ配列を参照する新しいsliceを作成することで、再sliceすることができます。
これはつまり、p[x:y]という書き方で、新たなsliceが作成されていることを示しているんでしょうか。
32.Making slices
make が現れました。
sliceは、make 関数で生成します。 これは、ゼロに初期化した配列をメモリに割り当て、その配列を参照したsliceを返す働きをします。
これを読む限り、配列とsliceは別物のようです。
33.Nil slices
slice はgolangでかなり重要そうですが、このツアーだけではいまいち飲み込めませんでした。
別途解説などを見て、じっくり理解しようと思います。
次は 「 34.Range 」から。