ゼロから学ぶGo言語プログラミング(8) A Tour of Go 25~33

f:id:belbo:20140616112930j:plain

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 」から。