オプション パッケージを作る際、柔軟性を持たせるためにオプションを持たせたい時がしばしばあります。 しかしオプションは知っての通り設定しないことが少なくありません。 単にコンストラクタに並べるようでは無用な複雑さをはらむことになります。 JavaなどではOptional Parameterなどのように、デフォルト値が指定できる機能があります。 機能の厳選されたgo言語ではそのような機能はありませんが、 "Self Referential Functions Design"というテクニックがあり、 それについての記事がRob Pike氏の記事を筆頭にいくつか説明されています。 オプションと相性が非常に良いため、合わせて"Functional Option Pattern"とも呼ばれています。 Dave Cheney氏の記事を参考におおまかに説明したいと思います。 様々な解決策 あるServe
What follows is the text of my presentation, Functional options for friendly APIs that I gave at dotGo this year. It has been edited slightly for readability. I want to thank Kelsey Hightower, Bill Kennedy, Jeremy Saenz, and Brian Ketelsen, for their assistance in preparing this talk. I want to begin my talk with a story. It is late 2014, your company is launching a revolutionary new distributed s
この記事は MicroAd Advent Calendar 2022 の12日目の記事です。 「Goのポインタは8バイトだから、ちょっとした構造体を値渡しでコピーするよりポインタで渡した方が早くなる」 長らくそう思い込んでいたのですが、以下の記事でポインタ渡しには意外なデメリットが多いことを知り、誤解だと気づきました。 この記事では自分なりにポインタのデメリットをまとめつつ、ポインタ渡しで本当に良いのかを確認すべきパターンを紹介しようと思います。 ポインタが実は高価な理由 ポインタが指す値にアクセスする際にnilかどうかのチェックが必ず入る ポインタがnilの場合、Goはpanic()をおこす必要があるため ポインタは動的メモリアロケーションの原因になりがち ポインタが指す値はヒープ領域に置かれがち(絶対ではないけど一般的に多い) ヒープ領域は確保にまとまったメモリの検索、解放にGCが必要
はじめに Go 強化月間 と聞いたので Go の記事を書きます。 Go で Stack や FIFO を実装する時には container/list を使います。この container/list は Stack と FIFO に必要となるベースのみ提供されます。なぜなら Stack も FIFO も仕組みは同じで、取り出す時に先頭か最後かの違いしかないからです。 Stack container/list をフィールドに持ち、末端に追加、末端から取り出すのが Stack ですね。 package main import ( "container/list" "fmt" ) type Stack struct { v *list.List } func NewStack() *Stack { return &Stack{v: list.New()} } func (s *Stack) Pus
こんにちは。プロダクト開発部の荒川 id:ad-sho-loko です。突然ですが、皆さんはこんな疑問を持ったことはありませんか? データベースの内部実装はどうなっているのか? トランザクションとはどのようなアルゴリズムで実現されているのか? NoSQLが遅いのはなぜか? 古典的なデータベースとは内部的にどのように違うの? データベースを何かしらの形で利用しているのにも関わらず、意外と内部の仕組みを理解していない場合が多いかと思います。僕もそうです。*1 しかし、エンジニアたるもの、その仕組みを知ることは非常に重要です。僕もデータベースについて勉強しようといくつかの本やサイトを調べていたのですが、なかでもCMU(カーネギーメロン大学)のDatabase System Groupがアップロードしている講義が最も勉強になりました。 www.youtube.com そして本ブログでは、上記の講義
他の言語になれた人が、初めてGoを書いた時にわかりにくいな、と思った部分はどのようなところがあるのか、難しいポイントはどこか、という情報を自分の経験や、会社の内外の人に聞いたりしてまとめてみました。まだまだたくさんあるのですが、多すぎるのでまずはこんなところで。コンテナで開発することがこれからますます増えていくと思われますし、その時にコンテナとの相性が抜群なGoをこれから使い始める人もどんどん増えていくと思います。 Goは特に言語のコアをシンプルに、何かを実現するときはそのシンプルな機能を組み合わせて実現しよう、というコンセプトです。つまり、他の言語で実現したいこと・できていることに比べて、Goは組み合わせ(イディオム)でカバーする領域が広くなります。そのあたりのとっかかりになる情報を提供することが、これからGoを触る人にとってつまずきを減らすことになると思います。 Go Conferen
**テスト駆動開発(TDD)で基礎を身につけましょう。**GoはTDDを学習するのに適した言語です。なぜなら、学習するのが簡単な言語であり、テストが組み込まれているからです。
概要トライ木のアルゴリズムと実装についてかく。 bmf-san/road-to-algorithm-master トライ木とはトライ木(プレフィックス木ともいう。英語はそれぞれ、trie、prefix tree)は文字列の集合を扱う木構造の一種。 各ノードは単一または複数の文字列あるいは数値を持ち(ノードは必ずしも値を持つ必要はない)、根ノードから葉に向かって探索して値をつなげていくことで単語を表現する。 ネットワークのレイヤーならIPアドレスの探索、アプリケーションレイヤーならhttpのルーティングに、機械学習とかの文脈であれば形態素解析といったところでトライ木の応用が見受けられる。 言葉で説明するよりもビジュアルのほうが頭に入りやすい。 Algorithm Visualizations - Trie (Prefix Tree) メモリ効率が悪いので、メモリ効率がボトルネックとなるような
こんにちは! Tech KAYAC Advent Calendar 2020 4日目を担当する荒賀(@ken39arg) です。 近況報告 毎年このアドベントカレンダーの場をかりて、趣味の長距離スポーツの結果を報告して承認欲求を満たしていたのですが、 昨年サブスリーを達成して今年はサブエガ1を目指していたフルマラソンの大会は中止となり、夏の趣味であるOWS2の大会も軒並み中止となってしまいました。 その代わりに今年は2018年に買って未クリアだったゼルダをプレイし、ハイラルの平和をなんとか今年中に取り戻せるように努力をしております。 Trie木が必要になった経緯 さて、アドベントカレンダーだからツリー → ツリーといえば我々の世界では木構造 → 木構造といえばトライ木ということではなく、 今年した仕事でTrie木を実装する機会があったので、その時の気づきを書いてみようかと思います。 今年ユ
I’ve seen a few examples of error handling like the following lately: func MightFail(id string) error { err := sqlStatement() if err != nil { return fmt.Errorf("mightFail failed with id %v because of sql: %w", id, err } ... return nil }See the problem? It becomes more clear when you start to use the function: func business(ids []string) error { for _, id := range ids { err := MightFail(id) if err
@dice_zuさんからhttp.DefaultTransportの正しい(?)コピーのやり方を教えてもらったのでメモしておく。 結論から言うとhttp.DefaultTransport変数にたいしてnet/http#Transport.Cloneメソッドを使うと良い。 これなら新しいGoのバージョンでhttp.Transportに新しいフィールドが追加されても問題ない。 https://pkg.go.dev/net/http#Transport.Clone TL;DR *http.Clientオブジェクトは再利用したほうがよい https://pkg.go.dev/net/http#Client 内部でTCPコネクションのキャッシュを持っているから http.DefaultClientはタイムアウトの設定がされていないので独自定義するのが一般的 http.Transportオブジェクトも
Web用語を100秒で解説するチャンネルを作りました! よかったらチェックしてみてください! はじめに この記事は、Go言語を学び始めたばかりの人や、チュートリアルを読んで途中で挫折してしまったという人に向けて、Go言語の基礎的な文法を解説した記事です。といっても全てをカバーするのは大変だと思ったので、私自身が A Tour of Go を読んで難しいと感じた点をいくつかピックアップして書きました。今回の記事では、ポインタ・構造体・メソッド・インターフェースについて解説していこうと思います。 ポインタ A Tour of Go では、ポインタについて次のような説明をしています。 Go has pointers. A pointer holds the memory address of a value. (訳) Goはポインタを扱います。 ポインタは値のメモリアドレスを指します。 この「メ
この記事はPySpa Advent Calendar 2021の14日目のエントリーとして書かれました。昨日のエントリーは冷凍食品でウキウキ引きこもり生活 でした。ちなみに私も70ℓの冷凍庫を購入しましたが本当にライフチェンジングでした。 総論: なぜログが必要か 可観測性 たとえ目的は自明でも、その動作までが自明なアプリケーションというものはほぼ存在しません。現実の世界のアプリケーションというものは、動作パラメータだったり実行環境だったり、起動時点でのさまざまな要因によって挙動を変えるものだからです。そして、そうしたアプリケーションにはライフサイクルというものがあります。ここでいうライフサイクルは、アプリケーションの処理が実行されるにつれ、アプリケーションの内外との情報のやりとりで生じる大局的な状態の変化のことです。アプリケーションが並行処理を行うようなものであれば、個々の並行処理の単位
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く