Go言語入門と使い方

Go言語入門と使い方

Go言語を勉強したくなったのでWindowsにインストールしてみます。

ダウンロードサイトはこちらです。

Go言語入門と使い方

ここでは1.8.1をインストールします。

msiファイルを実行すると以下画面が表示されます。

Go言語入門と使い方

「Next」をクリックします。

Go言語入門と使い方

「Next」をクリックします。

Go言語入門と使い方

インストールバスがC:\goで問題なければ「Next」をクリックします。

Go言語入門と使い方

「Install」をクリックします。これでインストールが始まります。

Go言語入門と使い方

「Finish」を押してインストール完了です。

パスを通す

C:\Go\binにパスを通します。と思ったんですが、すでに環境変数GOROOTが設定されています。

Go言語入門と使い方

Pathにも、「C:\Go\bin」が登録されています。

ですので、以下コマンドでバージョン確認してみます。

GOPATHを通す

Go言語にはGOROOTとGOPATHというのがあります。

ウィンドウズでは、%GOPATH%です。これは必ず設定しないといけません。

設定していない場合、デフォルトでは、「C:\Users\ユーザ名」がGOPATHになるようです。

以下のように設定します。

Go言語入門と使い方

OSの再起動が必要なようです。

Go言語のファイル拡張子

Go言語は、ファイル名.goとなります。

以下サンプルです。

このgoファイルをコンパイルして実行します。

コンパイルが通ったらbuildしてバイナリファイル(exe)を作成します。

これで、hello.exeが作成されます。

hello.exeを実行します。

パッケージ文

packageステートメントを使用して、どのパッケージに属するかを明記します。

import文

import文を使用してパッケージをインポートし、使用します。

入出力フォーマットを実装したパッケージfmtパッケージをインポートします。

fmtパッケージの関数を使用する場合は、fmt.関数名というように記述します。

fmt.Printfというのは、fmtパッケージにPrintfという関数が定義されているという事になります。

初めに実行される関数

Go言語では、mainパッケージのmain関数が初めに実行されます。

関数の記述方法は以下の通りです。

日本語に対応するプログラミングにする

上記のプログラムを以下のように書き換えます。

コンパイルすると以下のようにエラーが発生します。

これはGo言語はUTF-8で保存しないといけないためです。

hello.goをUTF-8で保存しなおし、コンパイルします。

コメント

Go言語内のコメントは複数行コメントは/*~*/、1行コメントは//となります。

複数import文

複数のimport文を記述する時は、()で囲むことができます。

但し、囲まずに1行ずつ書くことも可能です。

const文

constは定数を宣言する時に記述します。

複数同時に宣言する時はimport文と同じように()で囲むことができます。

但し、定数に配列やスライスを宣言することはできません。

varと=と:=

変数Strの宣言をしています。初期値は””です。

上記のように:=を使う際は初期値を指定する必要があります。

変数をカンマ区切りで宣言する

変数の宣言(初期化)はカンマ区切りで宣言することができます。

以下のように初期化せずに型だけ宣言することも可能です。

int型の場合、0で初期化されます。

fmt.Printfのパラメータ

%sは文字列です。%cは文字です。%dは10進数です。%fは小数です。%gは小数の無駄な0を省きます。

実行すると以下のようになります。

実行すると以下のようになります。

使用されていないimport文

使用されていないimport文を記述したままコンパイルするとエラーになります。

mainパッケージのmain関数は戻り値を持たない

main.mainは戻り値がありません。その為処理が正常終了すればそのまま終わります。

異常時に戻り値を返したい時は以下の記述をします。

以下、使用例です。

if文

if文は以下の書式になります。

条件式には、i == 0やi != 0などというようにtrueかfalseになるように記述します。

その他使える演算子は以下です。Javaと同じです。

if文を使用した例です。

結果は以下のようになります。int型は初期化していない場合は0で初期化されます。

go言語の配列宣言

配列を宣言する方法はいくつかあります。

以下は、int型の要素を6つ持つ配列iを宣言しています。

Go言語では、int型は0で初期化されます。bool型はfalseで初期化されます。

以下、例です。

結果は以下のようになります。

配列を初期化するには以下のように記述します。

3つのint型要素を持つnum配列を宣言しています。

でも同じです。

len(配列)とすると配列長を返してくれます。

結果は以下のようになります。

配列要素にアクセスする

配列要素にアクセスするにはJavaと同じく変数名[添え字]でアクセスします。

Go言語の添え字の基底値は0です。

以下、例です。

結果は以下のようになります。

Go言語の配列のもう一つの宣言方法

配列宣言方法はもう一つあります。要素数を指定せずに以下のように.(ドット)を使用する方法です。

以下、例です。

結果は以下のようになります。

配列に似ているスライス

Go言語では配列に非常に似ているスライスという型があります。

スライスは配列と違い、要素数を指定しません。

スライスの書式は以下の通りです。

スライスは、変数名[start:end]という記述をすることによって、スライスを操作することができます。

startは0以上、endは配列長までです。len関数までです。

結果は以下のようになります。

makeでスライスを作成する

make関数を使用することによってスライスを作成することができます。

make関数は組み込み関数なので、インポートする必要がなく、スライス型のオブジェクトを確保して初期化までしてくれます。

make関数の引数は3つあります。

第三引数を省略した場合、配列収容数=配列長となります。

結果は以下のようになります。

リスライス

既に出てきていますが、スライス変数を以下のように記述することをリスライスと言います。

リスライスでは、str[:]、str[0:]、str[:2]というように省略することが可能です。

リスライスで注意する点

リスライスした変数の要素の値を変更すると、元のスライスの要素の値も変更されます。

以下、例です。

結果は以下のようになります。

配列からスライスを作成する

配列からスライスを作成することができます。以下のように記述します。

これで、slcはスライスとなります。

以下、例です。

結果は以下のようになります。

スライスに要素を追加するappend

とすると、要素をスライスに追加していきます。

結果は以下のようになります。

上記プログラム内の

というようにスライスでなく、配列だった場合はappendが使えない為、エラーとなります。

appendは容量を拡張する

スライスには容量という概念が存在します。

makeでスライスを作成します。容量(第三引数)を省略すると長さと同じになります。

結果は以下のようになります。

では、appendで要素を増やしてみます。

結果は以下のようになります。

長さが4ですが、容量が6になぜなるのかはよくわかりません。。

スライスにスライスをコピーするcopy

組み込み関数のcopyを使えばスライスにスライスをコピーすることができます。

以下のようなプログラムがあるとします。

結果は以下のようになります。

上記のプログラムにcopyを追加してみます。

結果は以下のようになります。

長さの異なるスライスにスライスをcopy

先ほどは同じ長さのスライスにcopyしました。次は異なる長さのスライスにcopyした時の挙動を見てみます。

コピー元<コピー先の場合です。

結果は以下のようになります。

次に、コピー元>コピー先の場合です。

結果は以下のようになります。

エラーは発生せずにコピーが出来ることが確認できます。

Go言語のfor文

Go言語ではfor文は以下のように記述します。

以下は100万ループする例です。

timeをインポートして経過時間を最後に表示します。

結果は以下のようになります。

for文中のcontinueとbreak

Javaと同じようにGo言語でもcontinueとbreakが使えます。

配列やスライスをfor rangeでループする

rangeの戻り値は2つあり、添え字と要素値になります。

記述方法は以下のように記述します。

iに添え字が入り、jに要素値が入ります。結果は以下のようになります。

文字列を数値に変換する

Go言語では文字列⇔数値変換にはstrconvパッケージを使用します。

Atoi(string)関数の引数に文字列を渡し、戻り値は数値型になります。

以下、例です。

結果は以下のようになります。

文字列を浮動小数点型に変換する

文字列を浮動小数点型に変換するにはParseFloat(string)関数を使用します。

以下、例です。

結果は以下のようになります。

文字列をbool型に変換する

文字列をbool型に変換するにはParseBool(string)関数を使用します。

以下、例です。

結果は以下のようになります。

ファイル作成する

Go言語ではファイル入出力はosパッケージを使用します。

os.Createの引数はバッククォートで囲まなくてはいけません。write.txtが存在しなくても、この関数でファイルを作成します。

バッククォートで囲んだパスが存在しない場合、以下のようなエラーとなります。

バッククォートで囲んだパスが存在しない場合が絶対にない場合は、エラーが発生しませんので、アンダースコアでエラーハンドリングを省略することもできます。

ファイルのクローズにはdefer文を使用する

Go言語のdefer文は、その関数がreturnする直前に実行されます。

Javaでいうfinally句に記述するようなものでしょうか。

file.Write関数で作成したファイルに書き込みます。

以下、ファイル作成例です。

ファイルを読み込む

次はファイルを読み込んでみます。ファイルを読み込むのもosパッケージを使用します。

os.Open(ファイルパス)関数で読み込みます。

Open関数は、Fileと、エラーがあればエラーを返します。

File型のRead関数の引数用にスライスを作成します。以下は1024バイトのスライスです。

for文で読み込みが終わるまで無限ループします。

File型のRead関数の戻り値は、読み込んだバイト数と、エラーがあればエラーを返します。

ファイルの終わりはバイト数0とerrにEOFがセットされることで通知されます。

以下、ファイルを読み込む例です。

os/userパッケージを使用する

os/userパッケージを使用して、HomeDir関数を使用してホームディレクトリを取得します。

以下はuser.Current()が返すUser型のHomeDir関数を使用した例です。

結果は以下のようになります。

osパッケージをインポートしてディレクトリを操作する

osパッケージのMkdir関数を使用してカレントディレクトリにディレクトリを作成します。

ウィンドウズの場合でも第二引数にパーミッションを指定します。

サブディレクトリも含めたディレクトリ作成をする

サブディレクトリも一気に作成したい場合は、osパッケージのMkdirAll関数を使用します。

ウィンドウズの場合は\\としてエスケープしないといけないので注意。

ちなみにUNCサポートしているので便利。

ディレクトリを削除する

ディレクトリを削除したい場合は、osパッケージのRemove関数を使用します。

但し、ディレクトリ内が空の場合のみ削除することができます。

ディレクトリが空でない場合は、以下エラーが出ます。

ディレクトリ内のファイルやサブディレクトリも削除したい場合は、osパッケージのRemoveAll関数を使用します。

ディレクトリ名を変更する

ディレクトリ名を変更したい場合は、osパッケージのRename関数を使用します。

gotestがaaaに変わります。

ファイル名を変更する

ファイル名を変更したい場合は、osパッケージのRename関数を使用します。

これでa.txtがzzz.txtにリネームされます。

GoDocServerでローカルでドキュメントを見る

Goをインストールすると、「すべてのプログラム」-「Go Programming Language」フォルダが出来ています。

その中の「GoDocServer」をクリックします。

すると、以下の画面が起動されます。

Go言語入門と使い方

「http://localhost:6060/」にアクセスすると、ローカルでブラウザからドキュメントが見れるようになります。

独自関数を作成する

独自で関数を作成してみます。以下の書式です。

関数の第一引数に渡ってきたパスがディレクトリならtrue,ファイルならfalseを返す独自関数を作ってみます。以下です。

結果は以下のようになります。

カレントディレクトリを取得する

os.Getwd()でカレントディレクトリを取得することができます。

結果は以下のようになります。

コマンドライン引数を使用する

Go言語でコマンドライン引数を使用するにはosパッケージを使用します。

os.Argsはstring型のスライスで定義されており、コマンドパラメータが代入されます。

os.Args[0]は実行ファイル名が入ります。引数はスライスの添え字が1から連番で入ります。

結果は以下のようになります。

コマンドライン引数をflagパッケージをインポートして使用する

flagパッケージを使用するともうちょっとコマンドライン引数を便利に扱うことができます。

以下、例です。

flag.Intとか色々ありますが、第一引数がコマンドラインオプションです。

以下のように実行します。

-f、–fまではOKですが、—fで引数を指定するとエラーとなりますので注意してください。

-helpオプション(-hでも良い)を指定すると、第三引数のメッセージが表示されます。

Go言語のポインタ

Go言語でもC言語と同じようにポインタが使えます。但しポインタの演算はできません。

ポインタ変数の宣言は、変数の型名(intとか)の初めに*(アスタリスク)をつけます。

これがすごく覚えづらいですが、宣言時は型に*をつけます。

このポインタ変数にはアドレスしか代入できません。

変数のアドレスは、&(アドレス演算子)を使用します。

ポインタ変数の先頭に*(参照演算子)を使用するとポインタの中身を取得できます。

以下、例です。

結果は以下のようになります。

関数に値渡しと参照渡し(アドレス)をすることができます。

呼び出し元には&iというようにアドレスを渡します。

関数の定義ではfunc sample(a *int)というように型に*(アスタリスク)をつけて定義します。

以下、例です。

結果は以下のようになります。

ポインタ変数を宣言し、アドレスを代入せずに使用してみます。

結果は以下のようになります。

ポインタ変数にはアドレスを代入してから、値を取得することができるようになります。

以下、例です。

結果は以下のようになります。

ちゃんと0で初期化されていることが分かります。

newによるメモリ割り当て

newは組み込み関数で、Javaのnewとほぼ同じ感覚です。

int型なら、new(int)とします。new(int)が返す値は、int型の初期化された値を持つポインタ変数になります。

よって以下のようなポインタ変数の初期化ができます。

結果は以下のようになります。

先ほどのようにエラーとならず、0で初期化されているのが分かります。

Go言語で構造体を使用してオブジェクト指向にする

Go言語ではtypeというキーワードを使用して構造体を宣言することができます。

構造体の宣言例です。

構造体にアクセスする例です。

結果は以下のようになります。

構造体にメソッドを定義する

上記の構造体です。

このPersonにメソッドを追加します。

これで、変数名.Msg(“string型”)という使い方が出来るようになります。

以下、例です。

結果は以下のようになります。

ちなみに上記プログラムのp.Msg(“よう!”)部分ですが、以下のように第一引数に構造体変数を指定することで、以下のように書き換えることができます。

ファイル分割する

$GOPATHか$GOROOT配下にファイルを分割して配置することができます。

私の場合は$GOPATHは、「C:\Users\ユーザ名\」としています。

test.goというのを作成したい場合は以下のように作成します。

分割したtest.goの中身は以下の通りです。

ここで注意しないといけないのは、関数名の先頭1文字目は大文字にしないといけません。

testパッケージを使用するhello.goは以下の通りです。

LiteIDEをインストールする

Go言語に特化したIDEをこちらからインストールします。

liteidex31.windows-qt4.zipというファイルをダウンロードできますので、解凍します。

liteideというフォルダができますので、適当な場所に配置して、liteide\bin配下のliteide.exeをクリックします。これでliteideが起動します。

Go言語入門と使い方

かなり軽量です。

goファイルの配置場所を指定する

「ファイル」-「フォルダを開く…」でgoファイルを配置しているフォルダを指定します。

ここでは、D:\Gosrcにします。すると以下のようにフォルダ構成が左側に表示されます。

Go言語入門と使い方

ブレイクポイントを指定する

liteideではブレイクポイントを指定して、途中の変数などをウォッチする事が出来ます。

このあたりはEclipseに似ています。

ブレイクポイントを貼りたい箇所にカーソルを持っていき、F9を押します。すると左側にオレンジ色のマークがつきます。

Go言語入門と使い方

ブレイクポイントを削除したい場合は再度F9を押します。

ビルドラン(BR)

ビルドしてexeを作成して、そのexeを実行します。

ラン(R)

exeを実行します。exeがない場合、「エラー: プロセスの起動に失敗しました」とエラー表示されます。

ランターム(>R)

よくわかりません。

ファイルラン(FR)

goファイルを実行します。exeはなくてもgoファイルさえあれば動作します。

ビルド(B)

goファイルをビルドしてexeを作成します。

コンソールには以下のように出力されます。

以下のように実行すると、Gosrc.exeというバイナリファイルが作成されます。

ForceBuild(B!)

良くわかりませんけど強制的にビルド?

go generate(G)

go generateと実行すると、ソース中の「//go:generate」で始まるコメントを解析し、コマンドを実行してくれます。

以下、hello.goの例です。

test.goの例です。test.goのバイナリはtest.exeとします。

このファイル構成で以下のようにタイプします。

上記のように-vオプションを付加すると、処理されるファイル名を標準出力します。

gofmt(F)

goファイルを整形してくれます。整形はJavaに似ているように思います。

コマンドベースでタイプする場合は以下のようにタイプします。

これで、hello.goが綺麗に整形されます。

エラー

invalid UTF-8 encoding

goファイルの文字コードがUTF-8出ない場合に発生するエラー。

multiple-value idDir() in single-value context

関数の戻り値が異なる場合に発生するエラー。

imported and not used: “os”

インポート文が記述されているが使われていないパッケージがある場合発生するエラー。

const initializer [3]int literal is not a constant

配列やスライスを定数で宣言した場合発生するエラー。

p redeclared in this block

変数を重複して宣言した場合発生するエラー。

invalid indirect of p (type int)

ポインタ変数ではない普通の変数に*をつけた場合発生するエラー。

panic: runtime error: invalid memory address or nil pointer dereference

ポインタ変数を定義してアドレスを代入せずに使用した場合発生するエラー。

main redeclared in this block previous declaration at .\hello.go:11

main関数が複数宣言されている場合に発生するエラー。

cannot refer to unexported name test.test

関数名の先頭文字は大文字でない場合に発生するエラー。

open hello.go: The process cannot access the file because it is being used by another process.

他のアプリ(エディタなど)が開いたままでつかんでいると発生するエラー。

スポンサーリンク
  • このエントリーをはてなブックマークに追加
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA