GoLang

第5回「プログラミング言語Go」オンライン読書会

技術書典9に参加しました。自分が担当した章は超絶おまけレベルで紹介するのが恥ずかしいくらいなのですが、他の章が とても とても と〜ってもオススメなので紹介します。Goの基本文法が終わって脱ビギナーしたい方、競プロに入門したい方、分散メッセージングのKafkaって何?な方、などなど多彩な内容となっております。お値段は、Go1.15にちなんで1150円なり🐹

Go祭

Go祭

  • Go Starter Book
  • Go のいろいろな書き方を比較してみる
  • Go で作ろう!Webアプリのカスタムエラー
  • Go ではじめる!アルゴリズムとデータ構造
  • Gopherのためのドローン教室
  • Go でKafkaに入門

では本題。こちらの本でお勉強です。

印象に残ったところの、ざっくりメモ

第4章コンポジット型 続き

スライスを扱うときは基底の配列を意識しておくのが大事(岩田プロ)

前回の補足

P97「高度に最適化されたbytes.Equal関数」について、現在はStringに変換でやっているとのこと。

4.4構造体

  • フィールドの順序が異なる構造体同士は違う型として定義される。
  • 名前付き構造体Sは、同じ型のフィールドSを宣言することはできない。
  • Sはポインタ型の*Sを宣言することができる。
type tree struct { // treeとう名前の構造体
  value int
  left, right *tree // 構造体と同じ名前のポインタtree
}

重要

  • 構造体のゼロ値は、それぞれフィールドのゼロ値で構成される。
  • 実用的になるように設計しなければならない。

4.4.1 構造体リテラル

↓ p に Point{1, 2} をコピーしている。

type Point struct { X, Y int }
p := Point{1, 2}

↓ ふつう、リテラルのアドレスなんてとれないけど、こんな書き方ができる。

pp := &Point{1, 2} // 関数呼び出しなどの式内で使える。

実際には↓これと同じ。

pp := new(Point)
*pp = Point{1, 2}

4.4.3 構造体埋め込みと無名フィールド

  • 継承とは違う。
  • コンポジションは、Goにおけるオブジェクト指向。
  • Javaにはコンポジションがない。

岩田プロ@qt_luigi にご指摘いただきました(ありがたい🙏)

→Javaにもコンポジションはあるが、Goとはニュアンスが異なる。

  • Java...クラスが他のクラスを持つ感じ。
  • Go...埋め込みは構造体が他の構造体の性質を含む感じ。

4.5 JSON

ASN.1

  • JSONとかXMLみたいなフォーマットの種類。
  • 太古の昔からある。
  • 認証局が使っている。

JSON

  • encoding/jsonパッケージを使う。
  • Unicode
  • 数値、boolean、文字列。
  • JSONタグ、値が0だと出力しない。

P121のJSON例は、ジョークらしい。索引P428に、P121にロブ・パイクが出てくるってあるのに、実際には書かれていない。ネタと仕込まれている(岩田プロ🙏)

  • Go→JSON変換のことをマーシャリングという。
  • json.Marshalでおこなう。
  • 読みやすくするには、json.MarshalIndentを使う。
  • 公開されているフィールドだけがマーシャリングされる。
  • マーシャリングの逆はアンマーシャリング。
  • json.Unmarshalを使う。
Year int `json:"released"` // Yearフィールドがrelesedに関連付けられる。

4.6 テキストテンプレートとHTMLテンプレート

  • {{range .Item}}と{{end}}はループ。
  • {{range .Item}}と{{end}}内にあるPrintfは、Sprintfのシノニム。

シノニム...ふと、Oracleにでてくるシノニムと、PostgreSQLとか環境変数で出てくるエイリアスとはどう違うんだろ〜と思って調べたのですが、DBに限っては

  • シノニム...永続的な別名
  • エイリアス...一時的な別名

という感じらしいです。

第5章 関数

5.2 再帰

  • 自分自身を直接呼び出せる。
  • 自分自身を間接的に呼び出せる。
  • おおくのプログラミング言語は、関数呼び出しに固定長のスタックを使用する。
  • 固定長スタックはセキュリティリスクが高い。(@micchiebearさんメモから拝借)

↓用意された領域からはみ出るの例。

スタック

  • Javaは仮想空間に2MB作るので、たくさんスレッドを作れない。
    • CやJavaでは領域の上限がきまっている(岩田プロ)
  • Goは、関数呼び出しに可変長のスタックを使用する。
  • Goは2KBからはじまる。
  • (昔の)Cだとスタックは一方向にしかのびない。のびる。
    • →一方向にデータを積み出しする構造。(岩田プロ)
  • マルチスレッドだと?(聞き逃した。Gopher道場で説明があったような。あとで見返す)
    • Goは2KBから可変で上限をのばすため、マルチスレッドをたくさん作成&実行できる。(岩田プロ)

5.4 エラー

5.4.1 エラー処理戦略

  • fmt.Errorf("hoge %v) ← %w 推し(1.13から。岩田プロ)
  • エラーは頻繁に連鎖するから、メッセージは大文字にしない。
  • 改行は避ける。
  • エラーメッセージを詳細にする。
  • 問題に対して意味が分かる説明にする。
  • 同じ関数、同じパッケージの関数群から介されるエラーは同じ形式にし、同じ様に扱えるようにする。一貫性をもたせる。
  • インタラクティブに扱う場合は↑この限りではないかも。

どの言語でも同じだな〜。

質問&雑談タイム

読書会後は柴田氏と岩田プロが「構造体の埋め込み」について話していて、ふむふむ..全然わからん、と聞いておりましたが

  • Javaだと継承のなかに入れたりできる。
  • Goの埋め込みって継承とは違うよね。
  • Goで埋め込みできるけど、そんな実装をしているケースをみたことない。
  • 設計例が知りたいよねー。

的な感じな内容でした。私さんは何してる人なの?どんな言語とかやっての?的な感じでふっていただき、大したことしてないけどC時代の話とか、オフショアの話とか、人海戦術でやってる画面系のテストの話とか、現在うちの社内で抱えている問題について話したりしました。で柴田さんのハード時代のオフショアの話とか複写機のテストの話とか、現職でのWeb・モバイルでのテストのこととかお聞きすることができました。転職話とかも聞けておもしろかった。

で、E2Eテストを導入したいんだけど、という話をしたところ、他の参加者の方に「さいぷれす」

https://www.cypress.io/

というのを教えていただきました。職場でQAをやることになったので、調べる。来週の課題が増えました。

あとこれ「まーぶる」

https://www.mabl.com/

こっちは、先日受けたカジュ面で某Web企業さんから教えてもらいました。やさしい。聞いてみるものだな〜。

さいごに

JSONとかテンプレートのところで、バッククオートってなんで使うの?ダブルクォートじゃだめなん?と思って、P74をみかえしました。たぶん<pre>みたいなイメージで良いのではないかと理解した。tenntennさんの資料にものってたような.. (またおさらいしないと)

とうことで、今回も濃ゆ〜い内容でとても良かったのでした✨

また次回。

-GoLang