golang

Go言語のヒープに確保するデータの初期化コストについて調べてみた

2014.6.14追記 途中MakeContainer()/MakeContainerOneLine()がごちゃごちゃになっていたのを修正 golangでは、ヒープに置かれるデータの初期化方法によって内部の挙動が若干異なるみたい。 (環境はx86_64、go version 1.2.2) 違いが出たのは以下のコード。 …

Go言語での複数チャネルからのメッセージ受信

Goではgoroutineを使うことで並行処理をとても簡単に実行できるが、複数goroutineとの同期が難しい。 そこで、複数走らせたgoroutineのメッセージを用いた同期方法について考えてみた。 以下のように、複数のチャネルからのメッセージを受信する必要がある時…

Go言語でmmapシステムコールを使ったファイル読み込みの高速化検討とC言語のコンパイラの話

長いタイトル…。 こないだ書いたgorepっていう検索ツール、もうちょっと速くしたいなと思ってファイル読み込みの部分をmmap()で置き換える検討中。(ちょっぱやのagもmmap()を使っている) mmap()での高速化確認用にCとGoで簡単なコード書いて実験していたら、…

C言語とGo言語で標準出力が端末を参照しているかどうかを判定する

標準出力のディスクリプタを取得して、それが端末を参照しているかどうかを判定する。 使いどころは端末に出力する時と、ファイルにリダイレクト出力する時とで表示の仕方を変えたいとき。 例えば、以下のページの方法でターミナルの文字をカラーにできる。 …

Go言語でgorepっていう検索ツール書いた

ディレクトリ名やらファイル名やらGrep検索やらを一緒くたに正規表現で検索する"gorep"っていうツール書いた。 https://github.com/ryochack/gorep 以下のコマンドを打ち込むと、カレントディレクトリ以下から再帰的にgo..pにマッチするディレクトリ、ファイ…

Go言語の並行処理で総和を求める

パタヘネ本の7章(マルチコアとマルチプロセッサとクラスタ)に以下のような(ちょっと違うけど)図が載っていたので、Goの並行処理を使って100,000個の数の和を求めてみた。 最初の図とはちょっと違って、実際の制御はこんな感じ。 値が2つ揃ったら、加算を行う…

チャネルの配列(スライス)を生成する

Go言語でチャネルの配列(スライス)を生成するには、以下のように宣言する。 チャネルの固定長配列 var chans = []chan int { make(chan int), make(chan int), make(chan int), make(chan int), } もしくは var chans [4]chan int for i := range chans { ch…

Go言語のflagパッケージを使う

Go言語でコマンドラインオプションを扱う - そこはかとなく書くよん。 に触発されたので、flagパッケージについて自分で使ってみてハマったところを書いておく。 コマンドラインオプションの略称を登録する flag.IntVar()などのXxxVar()を使う。 これで -boo…

Go言語は定数配列宣言ができない

以下のコードはコンパイルが通らない。 package main func main() { const array = [...]int {1,2,3,4,5} } コンパイルエラー。 const initializer must be constan Goでは、配列やスライスは全てランタイム中に生成される。 それに対して、定数はコンパイル…