golangで定期処理などを書きたくなったのでどうやって書くか考えます。
とりあえずtimeパッケージかcontextパッケージあたりを使うと良さそうなので2つとも使ってみます。
golangで定期処理などを書きたくなったのでどうやって書くか考えます。
とりあえずtimeパッケージかcontextパッケージあたりを使うと良さそうなので2つとも使ってみます。
配列の中身つ1つに対してPrintf系のフォーマットにかけることを考えます。
さらにそれを利用して独自のSprintf関数を作ったりしてみる。
桁数を指定せずに大きな数値や精度の高い数値をそのまま文字列にしようとすると、途中で切れたり指数表記になったりする。
float64の数値をそのまま(非指数表記)でstringに変換したい。
簡単そうで意外にできなかったので方法を覚書きしておく。
template/htmlを使ってHTML表示を行う時、テンプレートの一部の表示方法を変えたいときがあります。
変えたい部分だけ変えたテンプレートを複数用意する方法もありますが、面倒というか煩雑になるのでパース部分に直接HTMLタグを書いて変更させたい。
そのままやるとタグ部分が文字列になったのでその対策方法メモ。
Execute部分などはgin-gonic/ginを使っているので省略。
ginでシングルバイナリからファイルサーブすることを考えた。
用途を考えるとシングルバイナリ化する利点はあまりないこともあり、標準メソッドだけではできなかったので実装メモです。
以前に書いた記事も参考にした。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//パッケージのインストール //statikコマンドを使えるようになる go get github.com/rakyll/statik //assetフォルダをgoファイル化する statik asset ... import ( "github.com/rakyll/statik/fs" _ "projectname/statik" // TODO: Replace with the absolute import path ) ... |
http.FileSystemとして扱えるようになる。
ファイルシステムの静的ファイルをサーブできるメソッド。
|
1 2 3 4 5 6 |
statikFS, err := fs.New() if err != nil { log.Fatal(err) } r:= gin.Default() r.StaticFS("/asset", statikFS) |
これが一番簡単だけどルートアクセスに設定できません。
ミドルウェアを使うことでルートに設定可能です。
|
1 |
r.Use(static.Serve("/", static.LocalFile("./assets", true))) |
これをstatikで使えるようにします。
Serveの第2引数はServeFileSystemなのでインターフェースを満たす必要がある。
|
1 2 3 4 |
type ServeFileSystem interface { http.FileSystem Exists(prefix string, path string) bool } |
Existsメソッドが必要そうなのでミドルウェアの実装から必要なものを抜き出して実装してみます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
type statikFileSystem struct { fs http.FileSystem } func (b *statikFileSystem) Open(name string) (http.File, error) { return b.fs.Open(name) } func (b *statikFileSystem) Exists(prefix string, filepath string) bool { if _, err := b.fs.Open(filepath); err != nil { return false } return true } func StatikFileSystem(fs http.FileSystem) *statikFileSystem{ return &statikFileSystem{ fs, } } |
|
1 |
r.Use(static.Serve("/", StatikFileSystem(statikFS))) |
これでルートからでもファイルサーブできるようになった。
Golang製Web Framework「gin」とjavascriptライブラリ「React」を合わせてウェブサービスを作ることを考えます。
ルーティング部分でちょっと詰まったので覚書き。
前にginを使ったWEBアプリをシングルバイナリ化をする場合、テンプレートを含めるなら別途実装が必要になると書いた。
現在はgolangでフロント部分を書かない方針だけど、そのうち必要になるかもしれないのでフォルダ内のテンプレートを一括で読むくらいの処理を書いてみました。
具体的にはginのLoadHTMLGlobの置き換えです。
GOで画像やHTMLを扱う時にシングルバイナリ化することで簡単にリリースできるようにしたい。
以前スマホアプリ制作用にgo-assets-builderを使ってバイナリ化したことがありますが、他の方法も検討してみて使ってみます。
golangパッケージ、ginを使ったWEBサービスのテストができたので実際にどう構築するか考えてみました。
思いついたときにサービス追加しやすいことを前提に構成する。
汎用的な関数を作りたいときにinterface{}型を引数にしてswitchで処理を書くことがあります。
忘れないうちに要点メモ。switchの以下の要素を使います。