■サンプルファイルのダウンロードについて
本書掲載のサンプルファイルは、下記 URL からダウンロードできます。

http://---------------------------------------------------

・本書の内容についてのご意見、ご質問は、お名前、ご連絡先を明記のうえ、小社出版部宛文書（郵送または E-mail）でお送りください。
・電話によるお問い合わせはお受けできません。
・本書の解説範囲を越える内容のご質問や、本書の内容と無関係なご質問にはお答えできません。
・匿名のフリーメールアドレスからのお問い合わせには返信しかねます。
本書で取り上げられているシステム名／製品名は、一般に開発各社の登録商標／商品名です。本書では、™ および ® マークは明記していません。本書に掲載されている団体／商品に対して、その商標権を侵害する意図は一切ありません。本書で紹介している URL や各サイトの内容は変更される場合があります。

はじめに

Go 言語はシンプルなプログラミング言語です。しかし、YouTube のような大規模で実用的なサイトが go 言語で構築されていることからもわかるように、Go 言語は実践的で強力なプログラミング言語でもあります。また、Go 言語の技術者は他のプログラミン
グ言語の技術者より高収入であることも知られています。

Go 言語は、完全にフリーかつオープンソースであり、Linux、macOS、Windows、Android、iOS など、現在の主要な OS に対応しています。Go 言語はコンパイラーを活用することや並行処理が言語レベルで備わっているために、これまでにないパフォーマンスを期待できます。たとえば、インタープリタ言語である Python では実現できないことを、Go 言語でならば容易に実現できる場合があります。また、豊富なライブラリを利用できるので、開発効率が高まります。

Go 言語は、比較的新しい言語です。そのため、これまでの他のプログラミング言語の良い点と弱点をよく検討して、現代の要求にふさわしい言語として作成されています。
たとえば、プログラマーは低レベルのメモリ管理に煩わされることはありません。メモ
リ管理はランタイムライブラリに任せておける一方で、Python や Java などのインタープリタ言語の実行効率を大幅に上回るパフォーマンスを実現しています。さらに、同じ

1 つのソースコードで多様な実行環境に対応することもできます。
本書はこのような特徴を持つ Go 言語のプログラミングをやさしく解説する書籍です。
特に Go 言語の重要な事項に焦点を当てて、簡潔なサンプルプログラムを豊富に使ってわかりやすく解説しています。コンピュータの基本的な操作や、ファイルやディレクト
リ（フォルダー）とそれらの基本的な操作、テキストファイルの作成と保存などについて知っていれば、誰でも本書を使って容易に Go 言語のプログラミングを学ぶことができます。
本書を参考にして Go 言語を楽しみながらマスターしてください。

2020 年 3 月 著者しるす

iii

本書の表記xyz

斜体で表記された文字（列）は、そこに具体的な文字や数値が入ることを表し[ ]書式の説明で [ ] で囲まれている場合は、その項目を省略可能であることを示

ます。

します。

>

OS のコマンドプロンプトを表します。Linux などの UNIX 系 OS での実行例では $ で示すこともあります。

補足説明や知っておくと良い事柄です。

ご注意●

本書の内容は本書執筆時の状態で記述しています。執筆時の Go 言語の最新のバージ
ョンは 1.13 です。将来、Go 言語のバージョンが変わるなど、何らかの理由で記述と実際とが異なる結果となる可能性があります。

●

本書は Go 言語や Go 言語で使うことができるパッケージについてすべて完全に解説するものではありません。必要に応じて Go 言語のドキュメントなどを参照してください。

●

本書のサンプルは、プログラミングを理解するために掲載するものです。実用的なアプリとして提供するものではありませんので、ユーザーのエラーへの対処やその他の面で省略してあるところがあります。

●

掲載しているプログラムコードの断片は、そのままでは実行できません。コードを実行するときには本書の内容をよく読んで理解してから実行してください。

iv

本書に関するお問い合わせについて
本書に関するお問い合わせは、sales@cutt.co.jp にメールでご連絡ください。
なお、お問い合わせ内容は本書に記述されている範囲に限らせていただきます。特定の環境や特定の目的に対するお問い合わせ等にはお答えできませんので、あらかじめご
了承ください。
お問い合わせの際には下記事項を明記してください。

●

氏名

●

連絡先メールアドレス

●

書名

●

記載ページ

●

問い合わせ内容

●

実行環境

v

も

く

じ

目次
はじめに................................................................................................................iii

第1章

はじめての Go 言語……1
1.1

hello プログラム..................................................................................... 2◆ はじめてのプログラム ……2◆ プログラムのビルドと実行 ……3◆ ビルド実行コマンド ……5

1.2

hello プログラムの意味.......................................................................... 6

1.3

Go 言語の日本語対応.............................................................................. 9

1.4

Playground.........................................................................................11◆ プログラムの解説 ……6◆ 日本語のプログラム ……9◆ Go 言語実行サイト ……11

練習問題 . ........................................................................................................12

第2章

基本的な要素……13
2.1

名前と文.................................................................................................14◆ キーワード ……14

◆ 名前の文字 ……14

◆ 文 ……15◆ エスケープシーケンス ……162.2

データ型.................................................................................................17◆ 論理値型 ……17

◆ 整数型 ……17

◆ 実数型 ……18

◆ 文字列型 ……19

◆ 配列型 ……20

◆ スライス型 ……21

◆ 構造体型 ……21

◆ ポインター型 ……21

◆ インターフェース型 ……22

◆ 複素数型 ……19

◆ 関数型 ……22

◆ マップ型 ……22

◆ チャンネル型 ……22

◆ 型の変換 ……23

vi

2.3

変数と定数.............................................................................................23

2.4

リテラル.................................................................................................27

2.5

演算子....................................................................................................29◆ 変数 ……23◆ 宣言の省略 ……24

◆ 数値のリテラル ……27

◆ 定数 ……24◆ 有効範囲 ……27

◆ 文字列リテラル ……28

◆ 二項演算子 ……29

◆ 単項演算子 ……31

◆ 比較演算子 ……32

◆ 論理演算子 ……32

◆ 代入演算子 ……33

◆ アドレス演算子 ……34

もくじ

◆ 送受信演算子 ……34

◆ 演算子の結合順序 ……35

練習問題 . ........................................................................................................36

第3章

コンソール入出力……37
3.1

コンソール出力......................................................................................38

3.2

コンソール入力......................................................................................43◆ fmt.Println() ……38

◆ fmt.Printf() ……38

◆ キーボードからの入力 ……43

◆ 書式指定文字列 ……40

◆ fmt.Scan() ……43

◆ fmt.Scanf() ……46

◆ スキャナー ……47

3.3

コマンドパラメーター..........................................................................49◆ コマンドライン引数の処理 ……49

練習問題 . ........................................................................................................52

第4章

制御構文……534.1

条件分岐.................................................................................................54

4.2

無条件分岐.............................................................................................60

4.3

繰り返し.................................................................................................62◆ if 文 ……54

◆ switch 文 ……56

◆ goto ……60

◆ for 文 ……62

◆ for … range 文 ……66

練習問題 . ........................................................................................................68

第5章

コンポジット型……695.1

配列........................................................................................................70

5.2

スライス.................................................................................................73

5.3

マップ....................................................................................................775.4

構造体....................................................................................................80◆ 配列の宣言と使用 ……70

◆ 配列の特性 ……72

◆ スライスの宣言と使用 ……73
◆ マップの概要 ……77
◆ 構造体の概要 ……80

◆ 配列とスライス ……76

◆ マップの作成 ……77
◆ 構造体の定義 ……81

◆ 構造体の使い方 ……82

◆ 構造体を持つ構造体 ……85

練習問題 . ........................................................................................................88

vii

第6章

関数……896.1

関数........................................................................................................906.2関数の定義.............................................................................................99◆ 関数 ……90◆ 文字列処理関数 ……94

◆ 日時に関する処理 ……97

◆ 関数の定義 ……99

◆ 複数の値を返す関数 ……100◆ ポインター ……105◆ 値渡しと参照渡し ……106◆ 可変長引数 ……101

練習問題 . .....................................................................................................108

第7章

メソッドとインターフェース……109
7.1

メソッド..............................................................................................110◆ メソッド ……110◆ 単純なメソッド ……110◆ 引数のあるメソッド ……112

7.2

インターフェース...............................................................................115◆ インターフェース ……115◆ インターフェースを使わないプログラム ……116◆ インターフェースを使うプログラム ……117◆ interface{} 型 ……121◆ 任意の型を受け取る関数 ……124

練習問題 . .....................................................................................................126

第8章

並列実行……127
8.1

ゴルーチン..........................................................................................128◆ 並列処理 ……128◆ ゴルーチン ……128◆ ウェイト ……131◆ 無名関数 ……133

8.2

ゴルーチン間の通信...........................................................................135◆ チャンネル ……135◆ select 文 ……138◆ バッファー付きチャンネル ……141

8.3

排他制御..............................................................................................143◆ 競合するプログラム ……143◆ 排他制御プログラム ……146

練習問題 . .....................................................................................................150

viii

もくじ

第9章

ファイル入出力……151
9.1

ファイル入出力...................................................................................152

9.2

書式付きファイル入出力....................................................................158

9.3

便利な入出力関数...............................................................................168◆ 単純な入出力 ……152◆ fmt.Fprintf() ……158◆ io.Copy() ……168◆ バッファー付き IO ……154◆ fmt.Fscanf() ……161◆ io/ioutil ……170

練習問題 . .....................................................................................................172

第 10 章ネットワーク……173
10.1

TCP....................................................................................................174◆ プログラムの概要 ……174◆ TCP サーバー ……175◆ TCP クライアント ……179

10.2

HTTP..................................................................................................182◆ HTTP Get ……182◆ HTTP サーバー ……184

練習問題 . .....................................................................................................188

第 11 章GUI プログラム……189
11.1

GUI プログラミングの基礎...............................................................190◆ GUI アプリの構造 ……190◆ Go 言語の GUI プログラミング ……191◆ shiny ……191

11.2

単純なウィンドウ...............................................................................192

11.3

描画とマウス......................................................................................198◆ ウィンドウの作成 ……192◆ プログラムの概要 ……198◆ イベント ……196◆ コード ……199

練習問題 . .....................................................................................................203

第 12 章さまざまなテクニック……205
12.1

数と文字列..........................................................................................206◆ 文字列を数に変換する ……206◆ 実数を整数にする ……207◆ 数を文字列に変換する ……206◆ 整数を実数にする ……207◆ 変数の型を調べる ……207

ix

12.2

システム..............................................................................................209◆ データ型のサイズを調べる ……209◆ プログラムを終了する ……210◆ 外部のプログラムを実行する ……210◆ 実行環境を識別する ……211

12.3◆ 環境変数を取得する ……211◆ 実行を一時的に停止する ……212

ソースファイルの分割.......................................................................212◆ 複数のソース ……212◆ パッケージ ……213◆ パッケージの初期化 ……216

12.4

エラーとデバッグ...............................................................................218

12.5

デバッグ..............................................................................................221◆ エラー ……218◆ パニック ……219◆ デバッグの手順 ……221◆ 状況の把握 ……221◆ 原因の追求 ……221◆ プログラムの修正 ……223

付

録……225
付録 A Go 言語のインストール.....................................................................226
付録 B Go 言語の主なツール.........................................................................229

付録 C Go 言語のシンプルリファレンス......................................................235
付録 D トラブル対策......................................................................................257
付録 E 練習問題の解答例...............................................................................261
付録 F 参考資料..............................................................................................287
索  引................................................................................................................288

x

第

1

章

はじめての Go 言語
ここでは Go 言語の単純なプログラムを作成して実行してみながら、Go 言語の概要を学びます。
ここで紹介する Go 言語の構成要素については後の章で詳しく説明するので、この章では詳細はありのままに受け入れて、Go 言語でプログラムを作って実行するための作業の流れを掴んでください。

第1章

はじめての Go 言語

第1章

はじめての Go 言語

1.1 hello プログラム
伝統的に、プログラミング言語を学ぶときの最初の課題は、「hello, world」と表示するプログラムを作ることでした。ここでは Go 言語で「hello, world」と表示するプログ
ラムを作って実行する方法を説明します。

◆ はじめてのプログラム ............................................................................. ◆Go 言語で「hello, world」と表示するプログラムを作る方法はいろいろありますが、

ここでは 1 行の文字列を出力する Go 言語の命令である Println() と呼ぶものを使って作ることにします。

次のソースプログラム（ソースリスト）をテキストエディターなどで入力してください。

そして、hello.go という名前でファイルに保存します（各行の意味は後で説明します）。
リスト1.1●hello.go// hello.go

package main
import "fmt"func main() {}fmt.Println("hello, world")

プログラムは UTF-8 という文字コードで保存してください。

2

1.1

hello プログラム◆ プログラムのビルドと実行 ..................................................................... ◆このプログラムを実行するためには、ソースファイル hello.go に対してビルド（コ12ンパイルともいう）と呼ぶ作業を行う必要があります。そのためには、このファイルを保存したディレクトリで次のコマンドを実行します。

3

go build [ソースファイル名]

4

次の例は Windows でファイルを「C:¥golang¥ch01¥hello」に保存したときの例

5

です。

6

C:¥user>cd C:¥golang¥ch01¥helloC:¥golang¥ch01¥hello>go build hello.go

7

これで実行可能ファイル hello.exe が生成されます。

また、ファイルを保存したディレクトリでファイル名を省略して「go build」とい8

うコマンドを実行することでもビルドできます（より複雑なプログラムでは省略すると

9

ビルドできない場合もあります）。
次の例は Windows でファイルを「C:¥golang¥ch01¥hello」に保存したときの例です。

10C:¥user>cd C:¥golang¥ch01¥hello

11

C:¥golang¥ch01¥hello>go build

これで実行可能ファイル hello.exe が生成されます（go build コマンドを実行す

12

ると、実行可能ファイル名がそのソースファイルがあるディレクトリ名になります）
。

付録

3

第1章

はじめての Go 言語「go build」 で ビ ル ド（ コ ン パ イ ル ） し た と き に は、 実 行 可 能 フ ァ イ ル 名 は そ のフ ァ イ ル が あ る サ ブ デ ィ レ ク ト リ 名 と 同 じ 名 前 に な り ま す。 た と え ば Windows で「C:¥golang¥ch01¥hello」にあるソースファイル hello.go をコンパイルしたら hello.
exe になりますが、「C:¥work¥sample」にあるソースファイル hello.go をコンパイルしたら sample.exe になります。

hello.exe を実行するためには単に「hello」と入力します。
C:¥golang¥ch01¥hello>hello
hello, world

ここで出力された「hello, world」がこのプログラムの実行結果です。

Linux の場合も同様にします。次の例はファイルを「~/golang/ch01/hello」に保存したときの例です（「~/」はユーザーのホームディレクトリを表します）。

$ cd ~/golang/ch01/hello$ go build

これで実行可能ファイル hello が生成されます。

生成された実行可能ファイル hello を実行するためには単に「./hello」と入力します。

$ ./hello

hello, world

ここで出力された「hello, world」がこのプログラムの実行結果です。

4

1.1

hello プログラム

1
Go 言語でビルドとは、ソースプログラムから実行可能なファイルを生成することです。この作業を（広義の）コンパイルと呼ぶこともあり、Go 言語のプログラムはソースプログラムを

2

コンパイルして初めて実行できるので、コンパイル言語あるいはコンパイラー言語と呼ぶことがあります。一方、Python のようにビルドする必要はなく、ソースファイルをそのまま読み込んで実行する言語をインタープリタ言語といいます。インタープリタ言語はコンパイルが不3

要なので手軽なように見えますが、実行に時間がかかるという大きな欠点があります。Go 言
語の実行可能ファイルは非常に高速で動作するので、特にアクセスが非常に多いサーバープロ
グラムのようなプログラムで個々のリクエストに対して並列実行することで威力を発揮でき

4

ます。

5
◆ ビルド実行コマンド ................................................................................. ◆ソースファイルをビルド（コンパイル）してその場で実行するためのコマンドとして、

go run コマンドがあります。

hello.go をビルドして即実行するときには次のようにします。

6
7
8> go run hello.go

この go run コマンドでプログラムを実行した場合は、実行可能ファイル（この場合は hello.exe や hello）は作成されません（go run コマンドでプログラムを実行する場合はソースファイル名を省略しません）
。

9
10
11
12

付録

5

第1章

はじめての Go 言語

1.2 hello プログラムの意味
ここでは hello プログラムの各行を詳しく説明します。

◆ プログラムの解説 ..................................................................................... ◆先ほど入力したプログラムをもう一度見てみましょう。
リスト1.2●hello.go// hello.go

package main
import "fmt"func main() {fmt.Println("hello, world")}

1 行目の「// hello.go」はコメントです。Go 言語では「//」で始まって行末までがコメントです。

コメントはプログラムの実行に影響を与えません。この例では、プログラムファイル
名をコメントにしています。なお、「//」で始まって行末までのコメントの他に、「/*」で始まり「*/」で終わるコメントを使うこともできます。この /* */ の形式のコメント

は複数行に渡っても構いません。たとえば次のように記述できます。
/** hello.go - 最初のサンプルプログラム*/

2 行目の「package main」は、以下の内容が main というパッケージと呼ぶものに含まれることを示しています。今の段階では、これは実行するプログラムに必要なおま
じないであると考えておいてください。

6

1.2

hello プログラムの意味

空行の次の行の「import "fmt"」は、fmt と呼ぶパッケージを使うことを宣言しています。この fmt は後でもう一度出てきます。

「func main() {」は、これが main という名前の関数であることを表しています。

Go のアプリケーションプログラムは、main という名前の関数にある最初の文から実行される決まりになっています。この行の最後の「{」は main という名前の関数のブロッ

1
2
3

クの最初であることを表しています。

4
関数とは、何らかの機能を持っていて、それを使う（呼び出すという）と何らかの作用をするものです。main という名前の関数は、このプログラムの機能を備えます。後で出てくる
Println() という関数は、引数の値を出力するという機能を持っています。関数であることを表すために main() とか Println() というように名前の後に () を付けることがよくあります。関数については第 6 章「関数」で詳しく説明します。

7 行目の「fmt.Println("hello, world")」は実際に実行される唯一の文で、fmtという名前のパッケージの中にある Println() という関数を使って「hello, world」という文字列を出力して改行するための命令です。

fmt と い う 名 前 の パ ッ ケ ー ジ の 中 に あ る Println() と い う 関 数 を 表 す た め に、fmt.

5
6
7
8
9

Println() という表現を使います。

10
ここでは Println() の引数は "hello, world" だけですが、Println() の引数には任意の数の任意の型の値を指定できます。複数の引数を指定するときには「,」
（カンマ）

11

で区切ります。たとえば次のようにします。
fmt.Println("hello", 10, 'x')

12// 「hello 10 120」と出力される'x' が 120 と出力されるのは、文字コードの値が出力されるからです（10 進数で 120 は

16 進数で 78 であり、これは x という文字の文字コードを表します）。

付録

7

第1章

はじめての Go 言語「fmt.Println("hello, world")」という行の前のほうの空白は、行を右にずらして表現することでこの文が「{」と「}」で囲まれたブロックの内部にあることを見やすくするためのものです。このように、空白を入れて行を右にずらして見やすくすることをインデントといいます。インデントもプログラムの実行には影響を与えません。そのため、次のように書いても間違いではありません。
func main() {fmt.Println("hello, world")}

しかし、目で見てわかりにくいので、ブロックの内側のコードはインデントするべきです。

最後の行の「}」は、「func main() {」という行の行末にあった「{」に対応するもので、この場合は main という名前の関数のブロックの最後であることを表しています。

Go 言語では、インデントの幅は水平タブ 1 個分のスペースにすることが推奨されています。
一般的には、水平タブ 1 個分のスペースは空白 8 個分（システムで変更可能）ですから、厳密には、「fmt.Println("hello, world")」の行は次のように記載するべきかもしれません。
func main() {}fmt.Println("hello, world")

しかし、本書は書籍であるために表示できる幅が限られているという事情から、印刷してあるソースコードでは、インデントを空白 4 個分にしています。gofmt というツール（→付録
B.2）を使うと、インデントを決められた通りにすることができます。

8

1.3

Go 言語の日本語対応

1

1.3 Go 言語の日本語対応

2

Go 言語ではソースコードに Unicode 文字を使うので、日本語を含めたさまざまな文
字を自由に使うことができます。

◆ 日本語のプログラム ................................................................................. ◆Go 言語のプログラムで日本語を表示するのは簡単です。たとえば、次のようにすることで日本語を表示したり入力することができます。

4
5
6

リスト1.3●hellojp.go// hellojp.go

7

package main
import "fmt"8

func main() {var name string

fmt.Printf("名前を入力してください：")9

fmt.Scan(&name)}3

fmt.Printf("こんにちは、%sさん!", name)

10
11

入力された文字列を受け取る fmt.Scan() や、書式を指定して出力する fmt.Printf() については第 3 章で説明します。ここでは日本語文字列を使うことができるプログラム例としてとらえてください。

12

これをコンパイルして実行すると次のように「こんにちは、」に続けて入力された名前が表示されます。

付録

9

第1章

はじめての Go 言語>go build>hellojp.exe

名前を入力してください：山本太郎
こんにちは、山本太郎さん!

関数や変数の名前に日本語を使うこともできます。
たとえば、次のプログラムのように、変数名や関数名を日本語にしてもビルドして実行することができます（変数や関数については第 2 章以降で説明します。ここではさま
ざまな名前に日本語を使えるという点に注目してください）。
リスト1.4●jpname.go// jpname.go
package main
import "fmt"func 名前表示(氏名 string) {}fmt.Printf("こんにちは、%sさん!", 氏名)

func main() {var 名前 string

fmt.Printf("名前を入力してください：")fmt.Scan(&名前)}名前表示(名前)

しかし、一般的には名前を日本語にすることは国際化や可読性の点で好ましくないので、変数名や関数名は特に理由がない限り平易な英語を使うべきです。

なお、ここで使われている関数 fmt.Scan() や、変数とプログラマーが自分で定義する関数については後の章で説明しますので、ここでは名前に日本語も使える例として見るだけにとどめてください。

10