単純なWebプログラミングプロジェクトではGoを使い始めましたが、単一の関数のローカルな事前計算を簡単に行う方法を理解できません。これは例えば、私はOCamlの中でかなり頻繁に行うものです:OCamlのに慣れていない人のためにGoの関数の単純な値を事前計算する
(* maybe render_page is a handler function for an HTTP server or something *)
let render_page =
(* let's say that Template.prepare takes a template string and returns its compiled representation *)
let templ = Template.prepare "user: {{.}}, group: {{.}}" in
(* return an anonymous function *)
fun user group ->
templ [user; group]
、私は2つのパラメータを取り、おそらくWebページを返す関数に名前render_page
を結合していているもの以上起こって、内部的にはまずtempl
へのローカルバインディングを作成しています(このバインディングはrender_page
の定義内でのみ表示され、計算は1回しか実行されません)。次に、匿名関数内のそのバインディングを使用します(実際の値はrender_page
にバインドされています)。したがって、render_page
を呼び出すと、毎回templ
は再コンパイルされません。クロージャ環境からフェッチされたばかりです。
Goでこれを実現する共通のパターンはありますか?可能な限りグローバル変数を避けたい。私は現在グローバル変数がパッケージの名前空間に限定されている可能性があることを認識していますが、これらの事前計算式の可視性を必要な機能だけに制限したい。
ありがとうございます!
Goには、関数ローカル静的変数はありません。関数の実行間で変更可能な値を共有する場合は、グローバル変数でなければなりません。不変の値には関数ローカル定数を使用できますが、定数は組み込み型に限定されています。 – Adrian
また、変数を構造体のメンバにし、そのユースケースに応じて関数をその構造体のメソッドに変換することもできます。構造体の同じインスタンスが確実に再利用されるようにする必要があります。個人的には私はただグローバルなものを使っています。 – Adrian