Go言語でピクセル補完的なプログラムを書いてみる その4

今回はfill関数です。
ソース全部が載っているPlayGroundはこちらです。

引数で渡されたimgがnilかどうかを調べています。
nilだった場合はerrorsパッケージのNew関数でerrorを作成しています。
引数にエラーメッセージの文字列リテラルを渡して、New関数の返すerrorをそのままreturnしています。


if img == nil {
    return errors.New("img is nil")
}

errorの作成

errorの作成(コンストラクト)にはerrorsパッケージのNew関数や、fmtパッケージのErrorf関数がつかえます。
errors.Newは文字列のみですが、fmt.Errorfは書式を使えます。


image.NRGBAのRectフィールド

image.NRGBAのRectフィールドを変数rectにコピーしています。
image.Rectは画像の範囲を表しています。


rect := img.Rect

ポインタを使ってのアクセス

Goはポインタを使ってアクセスするときにC++と違い、”->”を使わずに”.”でアクセスできます。


for文

Goにはループ文はforしかありません。
forは複数の形式をサポートしています。
continue文は最も内側のループの次の繰り返しに移行できます。
またbreak文で最も内側のブロック内部から抜けることができます。
もちろんreturn文でも抜けられます。


条件式のみのfor文

条件式は繰り返しが行われる直前に毎回評価されます。
条件が成り立っている場合に”{}”内の処理を繰り返します。
条件が成り立たない場合は次の繰り返しをせずにfor文を終了します。


for [a]<[b] {}

下記のようにすると無限ループになり、breakなどで抜けない限り終わりません。


for true {}

条件式が何もない時はtrueを記述した場合と同等です


for {}

初期化ステートメント、コンディション、ポストステートメントを使うfor文

初期化でループ変数などの初期化、条件式でループを続行するかの判定、ポストステートメントでループ変数のインクリメントなどを行います。
初期化ステートメントは、空でなければ一番最初に一度だけ実行されます。
初期化ステートメントで変数の宣言も行うときは、”:=”の省略形式しか使えません。
初期化ステートメントでは複数のループ変数の宣言や代入ができます。


for i := 0; i < 100; i++ {}
for i, j := 0, 0; i < 100; i++ {}

ポストステートメントではインクリメントやデクリメントは一つしか書けません。
二つ書きたい場合は複数代入を使って書きます。


for i, j := 0, 0; i < 100; i++, j++ {} //error   
for i, j := 0, 0; i < 100; i, j = i + 1, j + 1 {}

三つの要素はそれぞれ省略することができますが、”;”は省略できません。


for ;;{}

条件を省略した時はtrueを記述した場合と同等です。


for i := 0;; i++ {}
for i := 0; true; i++ {}

range句を使用したfor文

配列、スライス、文字列、マップ、チャネルから受信した値、これらの全てのエントリーを使って繰り返しを行います。
”range”の右にある配列などのエントリーを”=”の変数に1つずつコピーして”{}”内の処理を実行することを繰り返します。
使うときがあった場合にもう少し詳しく書きます。


for i = range [配列など] {}
for i, s := range [配列など] {}

インクリメント、デクリメント

Goは後置のインクリメント、デクリメントしかありません。


画像の塗りつぶし

外側でvが画像のY座標の範囲で一番小さいrect.Min.Yから一番大きいrect.Max.Yまでインクリメントしながらループし、
内側でhが画像のX座標の範囲で一番小さいrect.Min.Xから一番大きいrect.Max.Xまでインクリメントしながらループしています。
全ての座標のピクセルにcolを設定しています。
imae.NRGBAのSetメソッドはint型のx,y座標とcolor.Color型のカラーを受け取り、その座標にカラーを書き込みます。


for v := rect.Min.Y; v < rect.Max.Y; v++ {
    for h := rect.Min.X; h < rect.Max.X; h++ {
        img.Set(h, v, col)
    }
}

最後にエラーなく終わったのでerror型のnilを返しています。


return nil

言語の説明をしていたら非常に長くなったので、次回からは言語の説明は短くして進めます。

この記事へのコメント

最近のトラックバック