タグ

golangに関するshagのブックマーク (172)

  • テストしやすいGoコードのデザイン

    テストしやすいGoコードのデザイン golang.tokyo #2 12 December 2016 Taichi Nakashima 言いたいこと 明示的であれ! 2 whoami @deeeet / @tcnksm (GitHub) http://deeeet.com A PaaS Dev&Ops (Using go for CLI tool, API, Batch jobs) 3 OSS Tools gcli - The easy way to build Golang command-line application ghr - Create Github Release and upload artifacts in parallel Packages go-httpstat - Go package for tracing golang HTTP request latency

    shag
    shag 2016/12/16
    この資料がインターネットで無料で読めるとは!いい時代だ。
  • "err"という文字列をHighlightしておくとGolangのコードリーディングが捗る - ( ꒪⌓꒪) ゆるよろ日記

    vimの人はこんな感じで autocmd FileType go :highlight goErr cterm=bold ctermfg=214 autocmd FileType go :match goErr /\<err\>/

    "err"という文字列をHighlightしておくとGolangのコードリーディングが捗る - ( ꒪⌓꒪) ゆるよろ日記
    shag
    shag 2016/12/15
    確かに!
  • Golangにおけるinterfaceをつかったテストで mock を書く技法 - haya14busa

    いい記事に感化されて僕も何か書きたくなった。 Golangにおけるinterfaceをつかったテスト技法 | SOTA リスペクト: Big Sky :: golang で終了を確認するテストの書き方 GolangAPI Clientを実装する | SOTA Big Sky :: GolangAPI Clientを実装する、の続き 今週のやつではなく先週のです.今週のは特に知見がなかった…grpc-goとか使えたらクライアント勝手に生成されるしいいよねgrpc流行ると便利そう(感想) くらい Golangにおけるinterfaceをつかったテスト技法 | SOTA めっちゃいいなーと思ったんですが,テスト用 の mock を気軽に作るテクニックはあまり詳しく紹介されてなかったのでそのあたりの1つのテクニックを書きたい. 前提 僕もテストフレームワークや外部ツールは全く使わない.標準のt

    shag
    shag 2016/11/02
    go の interface が思いの外 test に便利だとい話を最近よくみるな。
  • Big Sky :: golang の sort インタフェース難しい問題が解決した

    golang では配列をソートしたい場合に癖があり、Int や Float64、String といった固定の型であれば sort パッケージが提供する関数でソートが可能でしたが、独自の型や Int64 等といった sort パッケージが用意していない型の配列をソートするには Sorter というインタフェースを備えた型で扱うしかありませんでした。 package main import ( "fmt" "sort" ) type Food struct { Name  string Price int } type Foods []Food func (f Foods) Len() int { return len(f) } func (f Foods) Less(i, j int) bool { return f[i].Price < f[j].Price } func (f Foods

    Big Sky :: golang の sort インタフェース難しい問題が解決した
    shag
    shag 2016/10/24
  • Go 言語で wc を実装してみた - takatoshiono's blog

    Go 言語で wc を実装してみた GitHub - takatoshiono/go-wc: Go implementation of wc command for practice なぜか A Tour of Go をやり終えた時「全然うまく書けない」というのが感想だった。もっと Go 言語のコードを読み書きする必要がある。 そして読むだけだとやる気が続かないから何か書きたい。何を作ろうか? Go 言語なのでスタンドアローンで起動するバイナリ実行形式のファイルがよさそう。仕様が簡単で手頃なやつがいいな...と考えて wc にしたのだった。他にも以下が候補にあった。 ab smtp server beer コマンド(なんかうまそうなビールを表示する) wc コマンド find コマンド (コマンド系で攻めるなら GNU coreutils, findutils などを見るとよさそうか...

    Go 言語で wc を実装してみた - takatoshiono's blog
    shag
    shag 2016/10/13
    これ実際やると結構大変そう。
  • Go1.7からSSAが導入された - flyhigh

    初めに Go 1.7がリリースされる。目玉の一つは、SSA-IRが導入されたことだろう。Go1.7でSSAが入るんだけど、SSAって何?と居酒屋で聞かれたことが稿の発端だった。私の知識だけでは包括的な説明にならなかったので、いろいろ調べつつそれをまとめた。 以下、一般的な話ではなく、なるべくGoに絞って話を進めている(コンパイラのコードはは cmd/compile/internal/gc あたりにある)。より一般的な話は、参考文献等を示したのでそちらを参考にしてほしい。いろいろ調べて、Goに追加されたSSAについて知るべきことは、SSAが何か?よりも、SSA導入したGoがどうなったか、であると思った。 SSAとは何か SSA とは Static Single Assignmentの略だ。一つの変数への代入は一度しか行われてない事が確約できる形式のコードだ。この形式のコードは、最適化が行い

    Go1.7からSSAが導入された - flyhigh
    shag
    shag 2016/08/15
  • Big Sky :: golang のサーバで帯域制限したい。

    次回予告「並列ダウンロードするHTTPクライアントをバンド幅制限するサーバをGoで実装した」 / “高速でダウンロードできるツールを Go で実装した。 - Qiita” https://t.co/6NfEyJCwbu — Kazuho Oku (@kazuho) July 13, 2016 並列ダウンローダを使うと幾らかサーバに負荷が掛かってしまいます。golang のサーバ側で帯域制限を行う場合には2つ方法があります。 転送量制限する 接続数制限する まずは転送量制限。転送量の制限には throttled が便利です。 GitHub - throttled/throttled: Package throttled implements rate limiting access to resources such as HTTP endpoints. README.md Throttle

    Big Sky :: golang のサーバで帯域制限したい。
    shag
    shag 2016/07/19
  • 『プログラミング言語Go』刊行記念イベント「Goの設計思想を読み解く~実際の開発に活かすために」

    7月6日にジュンク堂にて行われた『プログラミング言語Go』刊行記念イベント「Goの設計思想を読み解く~実際の開発に活かすために」で プログラミング言語Goの訳者である柴田さんと対談してきました。 トークセッションということで特にプレゼン資料的なものはないのですが、sliceの比較や、goroutine IDをあえて提供しないあたりにGoの設計思想であるSimplicity(簡潔性)が色濃くでているとかいう話をしました。 実際の開発に活かすには、Goでは具象型(concrete type)でAPIをきちんと考えて設計して、必要なところでinterface型を提供するようにしたほうがいいということを説明しました。特にJavaとかを書いている人とかは まずinterfaceを定義しようとすることが多いのでそれはやめたほうがいいと思います。interface型を先に定義するのはpremature

    『プログラミング言語Go』刊行記念イベント「Goの設計思想を読み解く~実際の開発に活かすために」
    shag
    shag 2016/07/14
  • Go言語でhttpサーバーを立ち上げてHello Worldをする - Qiita

    package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World") } func main() { http.HandleFunc("/", handler) // ハンドラを登録してウェブページを表示させる http.ListenAndServe(":8080", nil) } ServeHTTPを使う 既存のstructや型に対して、ServeHTTPメソッドを用意することで http.Handleに登録出来るようにする package main import ( "fmt" "net/http" ) type String string func (s String) ServeHTTP(w http

    Go言語でhttpサーバーを立ち上げてHello Worldをする - Qiita
    shag
    shag 2016/06/15
  • GolangのGCを追う

    Go1.5とGo1.6でGoのGCのレイテンシが大きく改善された.この変更について「ちゃんと」理解するため,アルゴリズムレベルでGoのGCについて追ってみた. まずGoのGCの現状をパフォーマンス(レイテンシ)の観点からまとめる.次に具体的なアルゴリズムについて,そして最後に実際の現場でのチューニングはどうすれば良いのかについて解説する. GoのGCの今 最初にGoのGCの最近の流れ(2016年5月まで)をまとめる. Go1.4までは単純なStop The World(STW)GCが実装されていたがGo1.5からは新たなGCアルゴリズムが導入された.導入の際に設定された数値目標は大きなヒープサイズにおいてもレイテンシを10ms以下に抑えることであった.Go1.5で新たなアルゴリムが実装されGo1.6で最適化が行われた. 以下は公開されているベンチマーク.まずはGo1.5を見る. Gophe

    shag
    shag 2016/05/09
  • Golang Error Handling lesson by Rob Pike - Block Rockin’ Codes

    Intro この記事は Go Advent Calendar 2014 の 15 日目の記事です。 例えばネットワークのフレーム処理的なものを書いている場合、以下のようなコードがよくでてきます。 There are many codes like this, while writing a Network Frame Parser program. var type uint8 err = binary.Read(r, binary.BigEndian, &type) if err != nil { return err } var length uint32 err = binary.Read(r, binary.BigEndian, &length) if err != nil { return err } ... 関数の中では、各要素の長さ毎に読み込んで、読み込みに失敗したらエラーを

    Golang Error Handling lesson by Rob Pike - Block Rockin’ Codes
    shag
    shag 2016/04/25
    なるほど。素敵なテクニック
  • 仕事の言語に飽きてきた人はGoを使ってみてほしい――『スターティングGo言語』著者が語るGoのパワー

    簡単で早いGoのパワーに目覚める ――『スターティングGo言語』はすでにJavaPHP、Cを使い慣れている方のために書かれた入門書ですが、松尾さんご自身はどのようなプログラミング遍歴があってGoを使い始めたのでしょうか。 松尾:私はこれまでさまざまなプログラミング言語に触れてきました。最初は、長崎・佐世保市に住んでいた小学生の頃で、MSX2+というパソコンをたまたま手に入れたのですが、周りに使い方を教えてくれる人はおらず、や雑誌で知識を吸収して、一人で遊んでいました。それがプログラミングの原体験です。それ以降もプログラミングは趣味でやっていました。大学を辞めたあと、福岡のとあるSI企業に勤めることになりました。当時はJavaの黎明期で、Java Applet、Servletといった新技術が採用され始めた時期で、さまざまなことを試していた記憶があります。 24歳の頃に東京に異動しました。

    仕事の言語に飽きてきた人はGoを使ってみてほしい――『スターティングGo言語』著者が語るGoのパワー
    shag
    shag 2016/04/25
  • Gopherの道を歩む – Node.jsからGo言語への移行 | POSTD

    私は大学時代に、興味位でJavaScriptを始めて、それ以来ウェブページを幾つか作成してきました。JavaScriptは常にC言語やJavaの合間の楽しい息抜きでしたが、アニメーションや、ユーザをあっと言わせるようなちょっとしたことを提供するといった、特殊な目的にかなり限られた言語だと考えていました。JavaScriptは覚えやすく、開発者に具体的な結果をすぐにもたらしてくれるので、コーディングする方法を学びたいと思っている人に私が教えた最初の言語でした。JavaScriptHTMLCSSを少し組み合わせれば、ウェブページが出来上がります。プログラミング初心者には喜ばれます。 その後、あることが2年前に起こりました。当時、私は、主にサーバーサイドのコードとAndroid用のアプリのプロトタイプに取り組む研究職に近い立場にいました。すぐにNode.jsの存在が目に留まりました。バック

    Gopherの道を歩む – Node.jsからGo言語への移行 | POSTD
    shag
    shag 2016/04/19
    Gopher = go言語話者. PHPer, Pythonista と同じ感じ
  • アプリケーションサーバのユニットテストする - Qiita

    お気に入りのThinkPadキーボードが壊れて不服な気持ちのうみさまです。 新しいX1Carbonを見てThinkPadへの忠誠心も切れかかっていた所だったので、今度はHHKBでも買います。 さて、golangにはアプリケーションサーバをユニットテストするため、net/http/httptestというパッケージが用意されています。 ハンドラのユニットテスト 例えば、こんな感じのアプリケーションがあったとしてHander()を試験したい場合、 package main import ( "net/http" "fmt" ) func Handler( w http.ResponseWriter, r *http.Request ) { fmt.Fprintf(w, "hello world") } func main() { http.HandleFunc("/", Handler) htt

    アプリケーションサーバのユニットテストする - Qiita
    shag
    shag 2016/04/16
  • Goでnet/httpを使う時のこまごまとした注意 - Qiita

    resp, err := http.DefaultClient.Do(req) if err != nil { return err } defer resp.Body.Close() HTTPレスポンスを受け取ったとき、err != nilのときresp.Bodyは常に非nilである(たとえBodyが0バイトであっても)。このresp.Body を Close するのは呼び出し側の責務である。Body.Close を怠ると、Keep-Alive(デフォルトで有効)のためにTCPコネクションが再利用されない。…ということが ドキュメントに口を酸っぱくして書いてある。 同一ホストへのコネクション数はデフォルトで最大2に制限されている 同一ホストへのコネクション数はhttp.DefaultMaxIdleConnsPerHost定数によりデフォルトで2に制限されている。 // DefaultMa

    Goでnet/httpを使う時のこまごまとした注意 - Qiita
    shag
    shag 2016/04/15
  • go test する時にサブディレクトリ込みでテストをまとめて実行する方法 | さにあらず

    go でテストを実行する時に、複数のディレクトリを再帰的にまとめてテストしたい場合には、... をワイルドカードとして使える。 例えば、こんな風になる。 とかすると、 GOPATH/src/github.com/taichi/myproject/GOPATH/src/github.com/taichi/myproject/subdir1GOPATH/src/github.com/taichi/myproject/componentの中にあるテストコードが全部実行される。 Ginkgo使ってるなら、

    go test する時にサブディレクトリ込みでテストをまとめて実行する方法 | さにあらず
    shag
    shag 2016/04/08
  • golang 1.4で追加されたtestingの便利機能(テストの初期化とお片づけ) - Qiita

    golangのtestingパッケージはシンプル主義のgoならではといった、最小限の機能のみを提供しています。実際のところこれまでも(ほぼ)充分な機能を提供してきたわけですが、テスト前の初期化を明確に定義できないなど、不満もありました。 そういうわけで、1.4からこの不満を解決するtesting.MとTestMain(*testing.M)が追加されています。これがかなり最高便利です。 従来のテクニック 当然、これまでもテストの"初期化"や"お片づけ"を書きたいという要求は当然ありました。それに対しては、go testコマンドがファイルをabc...順に読みこむことを利用して、ファイル名を工夫するというちょっと裏ワザ的な手法が一般的でした。 すなわち、最初に実行したいテストが書かれたファイルは「a_test.go」にして、最後に実行したいテストを「z_test.go」とするわけです。この方

    golang 1.4で追加されたtestingの便利機能(テストの初期化とお片づけ) - Qiita
    shag
    shag 2016/04/05
  • Go の相対パス import ができたりできなかったり - Qiita

    ツッコミお待ちしております。 追記: 下記は go version go1.3.3 windows/386 で確認しています。また Linux だと期待通りに動きます (thanks @heliac2000)。(というか Windows だけ通らない?) 追々記: GOPATH 配下では go build はローカルパッケージを参照できないことを教えてもらいました (thanks @mattn)。GOPATH 配下以外では Windows / Linux 共に (おそらくその他の環境でも) ローカルパッケージを参照することができます。 前提

    Go の相対パス import ができたりできなかったり - Qiita
    shag
    shag 2016/04/05
  • Go言語でCPU数に応じて並列処理数を制限する

    負荷のかかる処理を制限なしに並列化しても意味ない.処理の並列数を予測可能な場合は,当たりをつけて最適化するのもよいが,不明確な場合は,CPU数による制限が単純な1つの解になる. TL;DR CPU数に応じたバッファ長のChannelを使ってセマフォを実装する. 実例 mitchellh/gox goxはGo言語製のツールを並列コンパイルするツール.コンパイルの処理は重いため,デフォルトで並列処理数をCPU数で制限している. 簡単な例 例えば,以下のような単純な並列処理を考える.heavy()(重い処理)を並列で実行する. package main import ( "fmt" "sync" "time" ) func heavy(i int) { fmt.Println(i) time.Sleep(5 * time.Second) } func main() { var wg sync.W

    shag
    shag 2016/03/31
  • Perl MongerのためのGoの始め方

    Gotanda.pm #8 (2016-03-31 16:30) 37ページがおもいっきり間違っているので修正したものを後ほどUPします

    Perl MongerのためのGoの始め方
    shag
    shag 2016/03/31