カテゴリー: Go

Goで整数の絶対値を求めるのに math.Abs() を使わない方がいい理由

1. はじめに

Goで整数の絶対値を求めるとき、特に何も考えずに math.Abs() を使っていました。しかし、math.Abs()float64 を引数に取る関数なので、本当に問題がないのか気になって調べてみました。その結果、整数の絶対値を求めるときに math.Abs() を使うには注意が必要だということがわかりました。

注意が必要なのは以下の2点です。

以下に詳しく説明します。
続きを読む

定積分の値の近似値を台形公式により求めて返す関数

Golangで、定積分の値の近似値を台形公式により求めて返す関数を作成しました。

プログラム中の integrate という関数が定積分の値を求める関数です。引数として、定積分する関数と、定積分の区間を渡します。引数として渡す関数は、その引数も返す値も float64 型です。その上の N_SUBINTERVAL という定数を大きくするほど近似の精度が上がり、実行速度は遅くなります。例として、答えが π になる定積分を求めています。

続きを読む

flagパッケージでコマンドラインフラグが現れたか確認する方法

flagパッケージを使うと、コマンドラインフラグ(オプション)を便利に扱うことができます。

flagパッケージを使っていて、あるフラグがコマンドラインに現れたかどうかを検知したいという状況があったので、方法を調べてみました。

一つ目の方法はコマンドラインの内容を os.Args で直接調べる方法です。ただし、flagパッケージで作られるフラグは、例えば a という名前のフラグならば -a--a という2つの形式がある上に、引数を持つ場合、 -a x-a=x という2つの形式があるため、処理が複雑になってしまうかもしれません。また、osパッケージを使うのはあまりスマートな方法ではないと思います。

二つ目の方法は、フラグのデフォルトの値から変更があるかをチェックする方法です。これが一番普通の方法だと思います。しかし、コマンドラインでデフォルトと同じ値をセットした場合と、コマンドラインにそのフラグが現れていない場合の区別はつきません。

三つ目の方法は、 flag.Visit() という関数を使う方法です。 flagパッケージ内の関数を使って調べるには、これしかないようです。flag.Visit() に渡す関数を定義する必要がありますが、今回の目的には一番あっているようです。

上記の三つの方法を示すコードを作成してみました。
同じような状況があった場合は、この三つの方法をうまく使いわけるといいと思います。

続きを読む

ベータ分布の値を返す関数

Golangで、ベータ分布の値を返す関数を作成しました。

math パッケージにはガンマ関数の値を返す関数などがあるので、それらを組み合せることで、ベータ分布の値を返す関数は簡単に作ることができます。

続きを読む

バッファありチャネルとバッファなしチャネル

先日、ゴルーチンとチャネルを使った以下のようなプログラムを作成したところ、うまく動作しませんでした。

続きを読む

ハッシュ関数 SHA-256 のGoによる実装

ビットコインのしくみにも利用されていて,このところ話題になることの多いハッシュ関数SHA-256を、Goで実装してみました。

実行効率は考えずに、NISTの Secure Hash Standard のページ にある FIPS PUB 180-4 のファイル の記述に従って、わかりやすさを重視して作成しました。SHA-256のアルゴリズムを理解するのに役に立つと思います。

SHA-256のアルゴリズムは大きく分けて、以下の3つの段階に分かれます。

  1. 処理するメッセージ M の後ろに「1」のビットを1つ足して、その後ろに、メッセージの長さが (512の倍数 – 64) ビットになるまで「0」のビットを足す。
  2. その後ろに、元のメッセージ M の長さ(ビット数)の2進数表現を 64ビット足す。(このため、SHA-256で処理するメッセージの長さは 2の64乗未満でなければならない。)
  3. ハッシュ値を計算する。

実際のコードは以下の通りです。

続きを読む

panicとrecoverによるHello world

「プログラミング言語Go」の練習問題5.19「return文を含んでいないのに、ゼロ値ではない値を返す関数をpanicrecoverを使って書きなさい」の解答として、panicrecoverを使った Hello worldプログラムを作りました。

続きを読む

フルカラーのマンデルブロ集合の描画

「プログラミング言語Go」の練習問題3.5である、フルカラーの マンデルブロ集合(Mandelbrot set) を描画するプログラムを作成しました。元のプログラムで使われているcolor.Gray同様、color.RGBA型も引数がuint8なので、uint8型のインデックスでループをしています。

続きを読む

高さに基づくポリゴンの色付け

「プログラミング言語Go」の練習問題3.3の解答を作成しました。「gopl.io/ch3/surface」に、ポリゴンの中心点の高さに基づいて色を返す関数を追加して、SVGの polygon のところに style=\"fill: #%v; storoke: black;\" を追加したものです。

続きを読む

卵パック風図形の描画

「プログラミング言語Go」の練習問題3.2の解答として、卵パック風図形を描画するプログラムを作成しました。「gopl.io/ch3/surface」のプログラムの関数fのところと、「zscale」のところを変更したものです。特に難しいテクニックなどは使わずに、結構うまくできたと思います。

続きを読む