タグ

ブックマーク / pod.hatenablog.com (4)

  • 恥ずかしながら、golangの多値を返す関数の戻り値を引数に渡した場合の挙動を把握していなかった - podhmo's diary

    はじめに 通常の言語だと、多値とdestructuring(分配束縛)は別物で、単一の構造体をバラす構文が入っているという感じのことが多い(schemeなどではそれとは全く別に多値を返す事ができるけれど。一方でbindingのための構文が別途用意されている)。例えばpythonの例でいうと以下の様な感じ。 vs = (1, 2) x, y = vs 単一のタプルをdestructuringした結果、それぞれの値が変数に束縛されるという形。 これがgolangでも同様だと思っていたのだけれど。実はちょっと違ったという話。 ふつうの分配束縛(のように見える) golangでも多値を返す関数が定義できる(pair)。そしてpythonの例と同様の理屈でdestructuringが行われ、複数の引数を取る関数(add)に渡され使われる(ように見えていた)。 package main import

    恥ずかしながら、golangの多値を返す関数の戻り値を引数に渡した場合の挙動を把握していなかった - podhmo's diary
    tyru
    tyru 2017/05/29
  • deferのタイミングで関数の戻り値を変えたい場合には、named return使うしかないのかも? - podhmo's diary

    はじめに 例えば、以下の様な状況。 deferで何らかの後片付けをする。 この後片付けのタイミングでerrorが発生。 この時、deferの中の処理で発生したerrorを戻り値として返したい。このような事をしようとした場合にnamed returnを使うしかなかったという話。 sample f()の後片付けの最中のcleanup()でerrorが発生する場合。 func f()(string, error) { s, err := g() defer cleanup(s) return s, err } func g()(string, error) { return "ok", nil } func cleanup(s string) error { return fmt.Errorf("hmm") } もちろんこの時の出力結果は以下の様になる。 fmt.Println(f()) //

    deferのタイミングで関数の戻り値を変えたい場合には、named return使うしかないのかも? - podhmo's diary
    tyru
    tyru 2016/09/03
  • 使い捨てのコードのエラー処理について - podhmo's diary

    tl;dr panic時ではなくerror時にもfullのstack traceが欲しい pkg/errors が便利 はじめに しばらくgoを書いていて、使い捨てのコードのエラー処理についてどうすれば良いのか考えたりしていた。ここで言う使い捨てのコードというのは1ファイル位で作れそうな小さなコマンドラインのコマンドのようなものを指している。 まともなアプリケーションコードでは考えることが色々ある気がするけれど。使い捨てのコードなら以下を満たしていれば十分だと思った。 終了ステータスが0以外になる エラーの発生箇所が正確に分かる(stack trace) 前者はテキトーに書いても自然に満たす気がする。ここでは後者をどうするかについて書く。 panic時は問題なし。ただしerror時には問題がある ここでいうエラー処理は以下の2つを含んでいる。 panic時の処理 error時の処理 テキト

    使い捨てのコードのエラー処理について - podhmo's diary
    tyru
    tyru 2016/08/18
  • angularの$parse, $interpolate, $compile 位は把握しよう - podhmo's diary

    はじめに https://t.co/43GvPaLHo0 angularさんについてこれ空で分かる程度には分かっててほしいと思ったりした。— po (@podhmo) 2016, 1月 12 $parse, $interpolate, $compile これらはどれも文字列のような別の表現を解釈してjs objectを返すような機能を持つ関数達。 内部で使われている事が多いがどのようなものか把握しておくとangular.js自体のコードを読むのが捗るかもしれない。 前提 後々あげられているコードを試すには、 angularをnode.js上で実行する方法 を把握しておく必要がある。コレ使います。 各種API 各関数の説明を加える前に雑なmoduleを作っておく。このモジュールは後で使う。 angular.module("app", []); var inj = angular.inject

    angularの$parse, $interpolate, $compile 位は把握しよう - podhmo's diary
    tyru
    tyru 2016/08/08
  • 1