覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Go言語LT大会! 「最近、Go言語始めました」の会に行ってきた #golangjp

Go言語LT大会! 「最近、Go言語始めました」の会に参加してきました。

以下自分用のメモです。


概要

Go言語入門者のLT大会&懇親会

  • 開催日: 2017/6/5
  • 場所: レバレジーズ株式会社


おススメ・標準・準標準パッケージ20選

上田拓也 氏 (メルカリ/ソウゾウ)

  • Go標準のパッケージ
    • 様々な機能が提供されている
      • HTTPサーバ/クライアント
      • 文字列処理
      • 暗号化
      • 画像処理
    • 160パッケージぐらいある
  • Go標準のパッケージ
    • golang.org/xで提供されるパッケージ
    • 450パッケージ以上ある
  • fmtパッケージ
    • 書式付きプリント機能を提供する
    • %T, %q %vあたりが便利
    • %[1]d, %[2]dとかでN番目の値が出せる。引数の順番を指定できる。引数を使いまわすこともできる
    • fmt.Stringerが便利
      • JavaのtoString的な役割のインターフェース
  • ioパッケージ
    • IO関係の基本的な型が定義されている
      • io.Readerとio.Writerが強力
        • インターフェースの良い例
      • io.TeeReaderとかもあり便利
        • UNIXのteeコマンド的なもの
  • io/ioutilパッケージ
    • IO関係の便利関数がある
    • NopCloserが便利
    • ReadAllhあんまり使わない
      • ストリームのままやろう
  • stringsパッケージ
    • 文字列に関する処理を提供
    • strings.Readerが便利
      • 文字列をio.Readerに変換してくれる
    • strings.Fieldsが便利
      • ホワイトスペースでいい感じに区切ってくれる
  • bytesパッケージ
    • strringsにあるものはだいたいある
    • bytes.Readerが便利
      • []byteをio.Readerに変換できる
    • bytes.Bufferが便利
      • ゼロ値で扱える
  • bufioパッケージ
    • bufio.Scannerが便利
    • bufio.SplitFuncでカスタマイズ
  • encoding/binaryパッケージ
    • 構造体とバイト列をマッピングできる
    • Go1.9でmath/bitsが入る
  • x/textパッケージ
    • 日本語の文字コードに対応(EUCJO,Shift-JIS,ISO2022JPに対応)
    • 多言語化の機能を提供
    • transform.TransFormerが便利
      • ストリームのまま変換できる
      • 実際の例を何回か読まないと理解が難しい
  • flagパッケージ
    • コマンドライン引数に関する機能を提供
      • オプションパースが便利
      • flag.Argsでオプション以外の引数が取れる
      • ポインタの使用例としてGood
  • path/filepathパッケージ
    • ファイルパスに関係する処理を提供する
      • \や/を意識しなくてよい
    • filepath.Walkが便利
      • 再帰的にディレクトリを読んでいく
  • text/templateパッケージ
    • html/templateはHTML特化版
    • コマンドライン引数に使うと便利
    • コードジェネレーションにも利用できる
  • testingパッケージ
    • go testでユニットテストが実行できる
    • Go1.7からサブテストが可能
    • テストを並列で実行可能
      • t.Paralellを使う
    • カバレッジが取れる
      • -cover
  • net/httpパッケージ
    • HTTPサーバ.\/クライアントを提供する
      • http.Handlerを実装すればよい
      • インターフェース実装の良い例
      • 重量なWebフレームワークは必要ない
      • テストしやすい
  • net/http/httptestパッケージ
    • HTTPサーバのテストで使える機能を提供
      • ハンドラのテストが便利
      • httpdocも便利
  • syncパッケージ
    • ロックなどの機能を提供
      • sync.WaitGroupが便利
      • sync.Onceが便利
        • 1回だけ実行したい場合に楽
  • contextパッケージ
    • 複数のGoルーチンをまたいだキャンセル機能などに使える
    • context.Contextが強力
      • インターフェースなので拡張しやすい
    • errgroupパッケージも便利
  • imageパッケージ
    • 画像処理を提供するパッケージ
      • image.Imageがインターフェース
        • 実装すればなんでも画像として扱える
      • pngやjpeg,gifなどに対応している
  • x/imageパッケージ
    • 標準パッケージでは足りていない機能を提供
    • x/image/drawが描画機能を提供してくれる
    • フォントに関する機能も提供している
  • reflectパッケージ
    • リフレクションの機能を提供する
      • structタグにアクセスする唯一の方法
      • 使いどころを間違えなければ便利。遅いので乱用はNG
      • 食わず嫌いは良くない
      • パニックが起こりなくるのでちゃんとチェックを行うこと
  • goパッケージ
    • 静的解析の機能を提供する
      • 抽象構文木(AST)が取得できる
      • 式単位でもパースできる
      • 型チェックもできる
      • 自作開発ツールも作ることができる


Go開発合宿2017

@n0bisuke 氏

  • Goを書く合宿
    • いろんな人が集まってわいわいやるコミュニティ
  • 合宿場所にした土善旅館は開発合宿プランを用意している
    • 過去の合宿者の要望をもとにした優れた設備等がある


初心者がGoでCLIツールを作ってみて学んだこと

@syossan27 氏

  • 作ったOSS
    • kirimori
    • torisetsu
  • 初心者ならではの様々な失敗
    • packageで分ける粒度が分からず1つのファイルにすべて突っ込む
    • エラーハンドリング時に適当にpanicを使ったために自分がpani
    • 構造体メソッドンに対してポインタレシーバを使わない
    • やたら変数名を長くしてしまう


作って学ぶミニマムgolint

@minamijoyo 氏

  • golint
    • Goっぽくないコーディングスタイルを指摘してくれる
    • どうやって検出しているのか?
      • ただの辞書だった
  • よくわからないのでgolint作ってみた
    • 標準のgoパッケージを使う


j2hの紹介

@kanga333 氏

  • j2hを作った
    • JSONからHiveのDDLを出力してくれる
  • gjson
    • goでJSONを取り扱うライブラリの一つ
    • result.TypeでJSONのタイプを取得できる
    • ForReachで子要素に対して反復処理ができる


GoとLintのおいしい関係

@wata727 氏

GoとLintのおいしい関係 Go言語LT大会

  • Lint
    • コンパイラより詳細かつ厳密なチェック
  • Golint
    • Goのスタイルチェッカー
    • (個人的に)Golintの良いところ:行の長さを制限しない
  • Govet
    • コンパイラよりも詳しい検査を行う
  • Go Meta Linter
    • セキュリティとかtypoのチェックとか
  • goは標準パーサがある
    • 新しいシンタックスにも追従してくれる
  • Linterを作りやすい
  • GoではLintを使おう。Linterを作るならGoでやろう


Golangちゃんと始めてから1カ月経ちました

@nntsugu 氏

  • Datadog
    • デザインファーストなFWのgoaで書く
  • プチ合宿やりませんか?


We "Go" fast

@taison124 氏

  • Goで開発
    • 環境や作法が決まっていて迷いどころない
      • 暗黙知が排除されている
    • 標準のやり方でできる
  • 本質的な問題解決に時間や情報を集中できる

個人的にこのLTが一番ためになりました!!


コネクションプールをGoでどう作ろうか調べた話

Jumpei Mano 氏

  • golibmc
    • 1つのコネクションをロックしながら使いまわしている
    • ボトルネックになる
  • memcached用コネクションプールを実装するためにdatabase/sqlの実装を読んだ
    • 非常にいい勉強になった
    • Go特有のchannelを使うことで実装がすっきりしている


ずっとRubyをやっていたエンジニアがGoに入門して挫折して再挑戦した話

@suzan2go 氏

https://speakerdeck.com/suzan2go/zututorubywoyatuteitaenziniagagoniru-men-sitecuo-zhe-sitezai-tiao-zhan-sitahua

  • 敗因
    • Go言語でRubyのようなオブジェクト指向をやろうとしてしまった
    • Rubyのように楽に書く方法がないか探し求めてしまった
  • 再挑戦
    • GitHubでGo言語のアプリケーションを色々見てみる
    • Go言語の設計についての記事を色々読んでみる
    • Goに従ってみると楽しくなってきた
  • GoDocが凄い
  • Goに入ればGoに従え



関連エントリ