プログラミング言語Go読書会#2(1.3-1.6)[2017/03/24]

[Go読書会 #2 ](https://lancers-engineer.connpass.com/event/53586/) が[ランサーズ株式会社](https://www.lancers.co.jp/)で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容は[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)を冒頭から皆で読み進めていくというものです。

## 進捗した内容

+ 1章　チュートリアル
  + 1.3 重複した行を見つける
  + 1.4 GIFアニメーション
  + 1.5 URLからの取得
  + 1.6 URLからの平行な取得

## 話題に上がった話

### 1.3 重複した行を見つける

1.3の最初のプログラムを組んでいるときに、標準入力という物がでてくるのですが、実は初心者はこれの渡し方が分からないケースがあります。確かに、プログラムを始めたばかりの人は、この標準入力やストリームという単語はくせ者だと思います。書籍だと、[Linuxプログラミングインタフェース](https://www.amazon.co.jp/gp/product/487311585X/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=487311585X&linkCode=as2&tag=amesho-22&linkId=1ff5c0836efbbee923728340ae128ebe)では、2.5のファイルI/Oモデル。[詳解UNIXプログラミング 第3版](https://www.amazon.co.jp/gp/product/B00KRB9U8K/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00KRB9U8K&linkCode=as2&tag=amesho-22&linkId=506dbe04520eb38a79f2d8a3c5d88670)の5.2ストリームとFILEオブジェクトの所にちょっと書いてあるのですが、ネット上で見渡したところ[第2章 4.4BSD の設計の概要.6. I/O システム](https://www.freebsd.org/doc/ja_JP.eucJP/books/design-44bsd/overview-io-system.html)この辺が分かりやすかった気がします。

この辺、一番安心して渡せる参照先はどこなんだろうか。知りたい。

話がそれたので戻しますが、私の中では、ファイルに数行書いてcatからパイプして渡してやればいいかなと思っていたのですが、参加者のなかにechoのeオプションでいけますよと言う方がいらっしゃいまして、それでいけました。このオプションは知りませんでした。

```
echo -e 'aa\naa\n' | go run main.go
```

確かに[man echo](https://linuxjm.osdn.jp/html/GNU_sh-utils/man1/echo.1.html)を確認するとeオプションを渡すことでバックスラッシュしたエスケープ文字を解釈するようになるので、プログラムが要求している同一行が2つ現れるという条件を満たすことが出来ます。勉強になりました。

次に話題になったのはScanで、特にline等書いてないけど行毎に読み込んでるんですかね？という疑問が上がりまして、挙動を見る限りはそうなっているのですが、[中身](https://golang.org/pkg/bufio/#Scanner.Scan)を確認たりしてました。


```
// Scanner provides a convenient interface for reading data such as
// a file of newline-delimited lines of text. Successive calls to
// the Scan method will step through the 'tokens' of a file, skipping
// the bytes between the tokens. The specification of a token is
// defined by a split function of type SplitFunc; the default split
// function breaks the input into lines with line termination stripped. Split
// functions are defined in this package for scanning a file into
// lines, bytes, UTF-8-encoded runes, and space-delimited words. The
// client may instead provide a custom split function.
```

defaultのsplitの挙動がlineに分割する物だからそういう挙動になっているようですね。

あとは、関数に渡すときに渡した先でデータが変更されていたので気にされていた方がいたので、これは、[make](https://golang.org/pkg/builtin/#make)について話してこれは割り当てられたものへの参照を保持しているので可能なんで素みたいな話もしました。([go_spec](http://golang.jp/go_spec))

個人的に気になっていたのはバッファリング周りとかos.FileのRead、Writeまわりどうなってんだろうなと言うところです。あとで調べてみます。


### 1.4 GIFアニメーション

ここは、標準でGIFアニメがプログラムから生成されるということに驚いてる人がいたりして実行してて割と楽しかったところです。しかし、本文中にある[リサジュー図形](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B5%E3%82%B8%E3%83%A5%E3%83%BC%E5%9B%B3%E5%BD%A2)は1960年代のSF映画によくでてきたという話なんですが、具体的にどんな映画に出てきたのだろうか。


### 1.5 URLからの取得

ここだと、Bodyを何故Closeしているのかという疑問が出まして。これもストリームオープンしてデータ取得してるのでそれを閉じてますという話なんですが、他の言語どうなってんだろ。

個人的には、練習問題1.7のioutil.ReadAllの代わりにio.Copyをつかって書き換えなさいは良問だと思いました。

### 1.6 URLからの平行な取得

goの注目の機能である並行処理がここで出てきました。go文でゴルーチンを生成して、chanでチャンネルで通信するという話をして、こういうのが言語の機能として提供されているのは便利ですね。という話のついでに、皆さん普段はどういう感じに並行処理してるんですか。という流れになり、そこでerlangで並列処理するのはエラーメッセージが少なくて辛いけど、それさえ無ければすごくいい処理系ですよという話が聞けました。真面目にやったことないのでちょっとやってみたいです。

大体それぐらいの話をしたときに時間で次回は1.7から開始する予定です。