アセット的なアレを実行バイナリ内に入れる話。

結論 go言語でウェブアプリケーション書くなら、go-bindata使うべし。 はじめに goで書いたサーバは一つのバイナリに全部入るからデプロイが楽だという話がありますけども、それは全部のコードをgoで書いた時だけです。 ウェブアプリケーションでは、ユーザインターフェース用のテンプレートファイルなど、どうしてもgoのコードではないリソースが発生します。 例えばテンプレートをパーズする標準APIを見ると、こんな風になっています。 html/template#ParseFiles func ParseFiles(filenames ...string) (*Template, error) { return parseFiles(nil, filenames...) } このAPI構造はソースコードを配置しているディレクトリ構造が単純だと特に問題ないのですが、少し複雑なディレクトリ構造になるだけで途端に上手くいかなくなります。 »

エクスプローラからGOPATHを設定した状態でコマンドプロンプトを起動する

go言語において各種コマンドを実行する際には、GOPATHという環境変数が設定されている事が望ましい訳です。 絶賛WindowsユーザですのでCUIは余り好まないのですけども、全てをGUIで操作出来る訳でもない状況でありますので、Windows標準のファイラーであるところのエクスプローラをレジストリを弄って拡張します。 まずはGOPATHを設定するシェルスクリプトを記述します。 runwithgo.cmdというファイル名で好きなディレクトリにテキストファイルを作成します。 内容としては以下のようにします。 @echo off set GOPATH=%1 set PATH=%GOPATH%\bin;%PATH% cd %1 @for /f "tokens=3,4 »

go言語のコンストラクタでinterfaceを返す

go言語において呼び出し元にinterfaceのみを公開することで実装の詳細を隠ぺいすると、gomockを使ったテストがやり易くなります。 ざっくり結論だけ書くとこんな感じのコーディングパターンにすると良いよって感じなので、これだけ見て、何が言いたいのかすぐに分かる人は続きを読まなくても良いと思います。 package intf type Duck interface { Quack() string } type duck struct {} func NewDuck() Duck { return &duck{} } func (d *duck) Quack() string »

go言語におけるロギングについて

僕はJava方面に慣れていますのでslf4j(Logback)やlog4j2の様なロギングライブラリがあると扱い易いなぁ…と思う次第です。 まとめ 例によって結論から書くと XMLで設定する事に耐えられる ならseelogがオススメ。 CLIで指定出来る程度の設定が出来れば良いなら、公式リリースなglogがオススメ。 標準のlogパッケージについて まず、僕の開発環境はWindows7ですので、log/syslog を直接使うようなコードは避けたいのです。 加えて、コードをあまり変更せずに出力先や出力内容を変更したいのですけども、その為の標準的な方法は機能としてライブラリ内に組込まれていません。 テスティングフレームワークの時も同様に感じましたけども、go言語のコアライブラリは本当に一番下の足回りがあるのみです。 例えば、設定可能な項目はこれだけです。抜粋すると、 時間や日付をどういう単位で出力するか?(日付、 »

go言語におけるtrailing comma(ケツカンマ)問題について

僕は、javascriptにおけるIE対応で辛い思い出が沢山あるのでカンマの位置には神経質なのですけども皆様は如何でしょうか? まずは、go言語のリテラルに関する仕様とレキサーの仕様を確認しておいて下さい。 Composite literals Lexical elements - Semicolons カンマをつけるべきか、つけざるべきか で、仕様書には特にケツカンマについて特筆されていないのですよね。 普通の配列リテラルを宣言するとこうなります。 a := []int{1, 2, 3} このコードはケツカンマありでも文法的に正しいので、以下のコードは正しい。 a := []int{1, 2, »