丸善出版の『プログラミング言語Go』の読書履歴です。

出てきた内容の気になったポイントのまとめや練習問題の解答(自分なりの)を記載していきます。
(ここに記載されている内容で問題が生じても責任は負えませんのであしからず…。)

練習問題は結構長くなるものが増えてきたので、本文記載のコードの修正の場合は修正部分だけ抜粋しています。
すべてのコードが見たい場合はGitHubにあるので、そちらを見てみてください。
プログラミング言語Go GitHub

さて、第3章は基本データ型についてです。

もくじ

3.1 整数
3.2 浮動小数
3.3 複素数
3.4 ブーリアン
3.5 文字列
3.6 定数

これまでの章のまとめはこちら

第1章 チュートリアル
第2章プログラミング構造

スポンサーリンク

3.1 整数

Go言語の整数型には符号付きと符号なしがあります。
符号付き整数型は int8型、int16型、int32型、int64型があり、符号なし整数型には uint8型、uint16型、uint32型、uint64型があります。

また、ビット数が32ビットか64ビットになる int型と uint型もあります。
これらのビット数はハードウェア依存です。

他に rune型というのがあって、int32のシノニムで、慣習的にUncodeのコードポイントとして使われます。
byte型というのもあって、これはuint8のシノニムで、生データを扱うときに使われるようです。
それから、uintptr型というのもあって、これはポインタを格納するときに使うようです。

通常はint、uintを使えば良いようです。
ただ、intとint32と言ったデータ型は暗黙的に変換してくれないので、int32(x) といったように明示的に変換する必要があります。

算術、論理、比較演算子は次のようなものがあり、CやJavaなどと同じですね。
*, /, %, +, -, <<, >>, &, &^, |, ^, ==, !=, <, <=, >, >=, &&, ||

3.2 浮動小数点

Goでは float32 と float64 があって、それぞれ精度が6桁と約15桁になります。

小数点より前の桁を省略(.707)、もしくは後の桁を省略(1.)することができます。

非常に小さな値や大きな値は e または E を使った科学的記数法で書くこともできます。

練習問題3.1

不正な値があったらポリゴンをスキップする、という問題なので、単純にIsNaN() で値を調べるif文を追加しています。
(文中にあるソースコードの修正なので、修正部分の関数だけ抜粋します)

練習問題3.2

mathパッケージの別の関数を使って違う図形を作りなさい、という課題なのですが、数学が苦手ゆえ解答が出ず。。。
悩みすぎて先に進めなさそうなので、時々考えることにしてちょっとパスします(汗)

練習問題3.3

高さに基づいて色を変えよ、ということなのですが、こちらもイマイチ解答が浮かばずでして。。。
色はstyleを設定することで変更可能です。

練習問題3.4

SVGデータをクライアントに書き出すWebサーバを作成する、という問題なので、1章で作ったWebサーバを参考にしてこんな感じにすればブラウザで図形を見れるようになります。

HTTPリクエストでパラメータを受け取って高さなどを指定できるように、ともなるのですが、この辺は練習1.12でもやっているのでそちらを参考にしてください。

3.3 複素数

複素数ってなによ、と思うのは私だけ?(汗)

数学における複素数(ふくそすう、英: complex number)は、実数の対 a, b と 1 と線型独立な(実数ではない)要素 i の線型結合 a + bi の形に表される数(二元数: 実数体上の二次拡大環の元)で、基底元 i はその平方が −1 になるという特別な性質を持ち虚数単位と呼ばれる。

wikipediaより

全然わかんない…(@_@;)

ま、ま、ま、とりあえず読み進めます。はい。

複素数の生成にはcomplex関数が使えて、次のように書きます。

もっと単純に書くこともできて、次のようになります。

real関数、imag関数で実部と虚部を取り出すことができます。

練習問題3.5〜3.8

えぇと、、、数学が苦手な私にはだいぶ難しく、ちょっと解けていません。。。
ここで時間使いすぎても先に進めないので、この説の練習問題は飛ばしてしまいました。すみませんm(_ _)m

練習問題3.9

この問題は画像データをクライアントに書き出すWebサーバを作る、というものなので、問題1.12を参考にすれば出来ると思います。
パラメータを取得するところは作りこんでいませんが、クライアントに書き出すところまで作ったものがGitHubにアップロードしてあるので参考にしてみてください。
GitHub – 練習問題3.9

3.4 ブーリアン

ブーリアンは bool 型を使います。取り得る値は true と false の2つだけです。

&&演算子と || 演算子と組み合わせる事ができて、次のように書くことも可能です。

こうすると出力結果は false になります。
s が空文字の場合は s[0] でエラーになってしまうので、あらかじめ s != "" で空文字かどうかのチェックをしてから、1文字目のチェックをしているわけですね。
空文字の場合は最初の条件の時点でfalseになるので、エラーにならず処理はきちんと終わります。

それから、int と boolは暗黙の変換はないので、ifを使って変換することになります。

こんな感じに変換関数を用意しておくといいかもね、というお話でした。

3.5 文字列

テキスト文字列はUTF-8エンコードされたのUnicodeです。

文字数は組み込み関数の len() を使って取得でき、 s[0] とすると0番目の文字を取り出すこともできます。
部分文字列も取り出せて、 s[0:5] と言ったように書けばOKです。この場合、0から5未満の文字列を取り出すことになります。

+ 演算子を使って文字列を結合して新しい文字列を生成することができます。

あくまでも新しい文字列が生成されるので、s を代入しておいた t は元のままの文字列になります。

文字列は不変なので、文字列のデータを直接変換することはできません。
例えば以下のようにするとコンパイルエラーになります。

3.5.1 文字列リテラル

文字列リテラルは ""(ダブルクォート)で囲んで書きます。

\(バックスラッシュ)で始まるエスケープシーケンスも使えます。

生文字列リテラル(raw string literal)はダブルクオートの代わりにバッククォート ` で囲みます。
生文字列リテラルはエスケープシーケンスが使えません。
ま文字列はプログラムソース内で複数行に広げることができたり、バックスラッシュを含むことが多い正規表現を書くときに便利です。

3.5.2 Unicode

昔はASCIIだったけど、いろいろな言語に対応するためにUnicodeができたよ、といった話です。

Go言語でも文字列はUnicodeで扱われます。
文字コードはGo言語ではルーン(rune)と呼ばれる規格番号を割り当てています。

3.5.3 UTF-8

UTF-8はUnicodeコードポイントのバイトしての可変長エンコーディングです。
最近はUTF-8が使われることが非常に多いですね。

Go言語ではutf-8パッケージが用意されていて、いろいろな機能があるようです。
ルーンとUTF-8の変換と言った関数も用意されています。

3.5.4 文字列とバイトスライス

文字列を操作するには、bytes、strings、strconv、unicode の標準パッケージを使うことができます。

strings パッケージは文字列の検索、置換、比較、トリミング、分割、連結などの関数を提供しています。
bytes パッケージは文字列をバイトスライスとして操作することができて、stringsと同じような機能も持っています。
strconv パッケージは整数値、ブール値、浮動小数点値から文字列へ変換やその逆変換などの機能を提供します。
unicode パッケージはルーンを分類するための関数などを提供します。

この節ではこれらのパッケージを使わないで文字列をバイトスライスとして扱う方法や、stringsやbytesを使った方法などを紹介しています。

この節では練習問題があるので、文中に出てくる commma プログラムから修正した部分だけ抜粋しています。

練習問題 3.10

文字列連結の代わりに bytes.Buffer を使って行う、というものです。ちょっと冗長な気もしますがとりあえず…。

練習問題3.10 GitHub

練習問題 3.11

comma を機能拡張して、符号記号を持つ浮動小数点を扱えるようにする、という問題です。

練習問題3.11 GitHub

練習問題 3.12

この問題はちょっと飛ばしてしまいました。すみません…m(_ _)m

3.5.5 文字列と数値の変換

文字列と数値の変換はよくやるのですが、Go言語の場合は strconv パッケージか fmt.Sprintf を使うと簡単にできます。

3.6 定数

定数は実行時ではなくコンパイル時に評価が行われることが保障されている式です。
定数にはブーリアン、文字列、数値の基本型を使うことが可能です。

定数を定義するには const を使います。

定数もひとつの宣言内に書くことができます。

3.6.1 定数生成器 iota

const宣言で定数生成器 iota を使うことができます。

次のように書くと、Sundayはint型なので 0 が設定されます。
そのあとのMonday以降の定数には値を指定していませんが、1ずつインクリメントされた値が設定されます。

多言語によくある Enumのような型にすることができます。

練習問題 3.13

iotaはビット演算はできますが、塁上演算子がないので、1000の累乗を生成するにはどうしたらいいか、という問題です。
単純に1000を掛けて行くようにしただけですが、これでいいのかしら…

3.6.2 型付けなし定数

const宣言では型に結びついていない定数を定義することができて、その場合は基本型の値より遥かに高い数値精度を表現することができます。

前節で Zib や YiB は定数にそのまま代入しようとしたり、fmt.Printlnで表示しようとするとオーバーフローを起こしてエラーになっていましたが、次のように式に使うことが可能です。

また変数や定数に代入するときには明示的な変換を必要しません。
ただし、変数に代入したあとに精度の違う変数に使いたい場合は型変換が必要となります。

さて、、、ようやく基本データ型の章が終わりました。
この投稿も結構なボリュームになりましたが、書籍もかなりボリュームがあります。
もちろん基本中の基本な章なのでしっかり抑えておくことが大事だと思います。

丸善出版の『プログラミング言語Go』の読書履歴です。

出てきた内容の気になったポイントのまとめや練習問題の解答(自分なりの)を記載していきます。
(ここに記載されている内容で問題が生じても責任は負えませんのであしからず…。)

この章では主に変数やパッケージ、スコープについての説明になります。

練習問題があまりないので、各節の気になったポイントを書いていこうと思います。

もくじ

2.1 名前
2.2 宣言
2.3 変数
2.4 代入
2.5 型宣言
2.6 パッケージとファイル
2.7 スコープ

2.1 名前

Go言語では大文字小文字は区別されるので、heapSort と Heapsort は異なる名前になります。
(大抵の言語はそうですけど。)

最初の文字が大文字が小文字かでパッケージ外から見えるかどうかが変わって、大文字だとパッケージ外からアクセス可能になります。

他の言語だと関数名の先頭は小文字っていうのが多いので fmt.Println() とか大文字で始まるのが気持ち悪いなぁと思っていたのですが、なるほどこういうことなのですね。

なので他言語でよく見られる public や private と言ったキーワードがないようです。

関数内で宣言されたローカルなので関数内でしか使えませんが、関数外で宣言された変数はそのパッケージ内からは使うことができます。

2.2 宣言

宣言において重要なものが4種類あって、それは var、const、type、funcで、それぞれ変数、定数、型、関数ですね。

2.3 変数

変数はvarを使って定義して、初期値を設定します。基本構文は以下になります。

具体的に書くこんな感じ。

type か expression の部分を省略することができます。
type が省略されたときは、初期値によって型が決まります。(型推論ですね)
expression が省略された場合はその方に対するゼロ値になります。
数値なら0、真偽値ならfalse、文字列なら””、インタフェースと参照型はnilと言った具合です。

単一宣言で複数の変数を宣言することができて、初期値を宣言時に設定する場合はデータ型が異なっていてもOKです。

2.3.1 省略変数宣言

ローカル変数を宣言して初期化するときに省略変数宣言を使うことができます。

チュートリアルで sep := " " とか出てきてなんだろうと思っていたのですが、ようやく納得ですw

宣言時に初期値を設定しない場合や明示的な型の宣言が必要な場合は var を使います。

諸略変数宣言ですが、複数の変数でもOKで、同じように := を使います。

便利だからと言って多用し過ぎると可読性が落ちてしまうので、ローカル内でそれほど使われないというような変数のみにしたほうがよさそうですね。

2.3.2 ポインタ

おぉ。ポインタ。C/C++以外ではポインタって用語を使う言語が少ないので、ちょっと身構えてしまいますね。
(もともとC/C++プログラマなんですけど、私w)

C/C++のポインタとほぼ同じような考え方です。
ポインタを指す場合は & を使って、ポインタの中身を取り出すときは * を使います。

このようなソースの場合は p は x のポインタ(変数のアドレス)が格納されているので、*p とするとポインタの中身を書き換えるので、x も書き換わります。

うん、C/C++と同じですね。

2.3.3 new関数

変数を作成する別の方法として new 関数があります。

変数名を付ける必要がないときなどに便利そうです。

すごく単純な例ですけど、こういう使い方ができるようです。

2.3.4 変数の保存期間

変数は到達不可能になるまで存在し続け、その後はそのメモリ領域は再利用されるかもしれない、というお話ですね。

ただ、ガベージコレクションが基本的にやってくれるので、そこまで神経質に考える必要はないけれど少し頭に入れておくのはいいとは思います。

2.4 代入

代入するには = を使えばOKです。これまでにも出てきていますが。

+=*=などや++--も使えます。

2.4.1 タプル代入

タプル代入では複数の変数に一度に代入ができます。

以下のような2つの変数の値を交換するという使い方もできます。

今までにも出てきたような関数から複数の値を受け取るようなものもタプル代入ですね。

Go言語は使われない変数を定義することができないので、複数値を返す関数の1つの値しか使わない、という場合には ブランク識別子 _ (アンダースコア) を指定することで安全に破棄してくれるようになります。

例えば、io.Copy() はコピーしたバイト数とエラー値を返しますが、バイト数がいらない場合はブランクにしてあげればOKです。

2.4.2 代入可能性

暗黙的に発生する代入があり、例えば、関数は引数をパラメータ変数に暗黙的に代入するというようなお話ですね。

あとはスライスの初期値の設定なんかもそういうことらしいです。

型によっても変わってくるので、あとの章で説明があるようです。

2.5 型宣言

もともと用意されている型はいろいろありますが、type宣言をすると既存の方と同じ基底型を持つ新しい型を作ることができます。

構文はこのようになります

たとえば、長さの単位毎に型を作って見るとすると以下のようになります。

どちらもflota64を基底型としていますが、まったく別の型として使うことができます。

typeも名前の先頭を大文字で書くとパッケージ外からも使うことができるようになります。

2.6 パッケージとファイル

今までもなんとなく書いてきたpackageについてです。

他の言語と同じように名前空間として機能があって、同じ関数名がバッティングしないようにするために使います。

構文は次のようになります。

同じパッケージに属しているファイルであれば、パッケージ名を使うことなく関数や変数を使うことができます。

練習問題2.1

さて、この章では初めても練習問題です。

書籍の本文に記載されている摂氏、華氏の変換モジュールに絶対温度との変換も追加しなさい、というようなものですね。

とりあえずこんな感じでいいかな、と…
exportedな関数にドックコメントをつけていないとwarningが出てしまいますが、とりあえず面倒なので入れていません(汗)

2.6.1 インポート

パッケージを作ったら、使う場合はインポートをしてあげなければいけません。

今までも fmtやstringsなどなどいろいろとインポートしていたのも同様ですね。

パッケージ名とフォルダ名は一致させておいたほうがいいようです。
なぜならば、インポートで指定するのはフォルダ名なんですよね。

というわけで、私はGOPATHで指定したパスのsrcフォルダのなかに、lessons というフォルダを作っていその中に書籍のソースや練習問題を入れています。
なので、前節のソースコードは $GOPATH/lessons/ch2/tempconv というフォルダに入れてあります。

このtempconvをインポートする場合は下記のように指定してあげればOKです。
$GOPATH/src 以下のパスを指定しないと、標準パッケージを見に行こうとするので、独自パッケージの場合はパスの指定が必要なようです。

こうすると、標準パッケージと同じように tempconv.FToC というように書けるわけです。

練習問題2.2

さてさて、練習問題ですね。
main.goでコマンドライン引数がない場合は、オプションと値を入力してもらうようにしています。
それから、コマンドライン引数の場合は flag を使ってオプションと値を取るようにしました。

2.6.2 パッケージ初期化

パッケージの初期化処理は func init() {...} という特殊な関数を使うことができます。

変数の初期化程度なら、パッケージレベルで行えばいいのですが、処理が複雑になってくるとそれも難しいので、そういうときに init() を使うといいようです。
他の言語のクラスのコンストラクタのようなものですね。最初に必ず実行されます。

練習問題2.3

単一式ではなくループってことなので、こんなかんじ?
性能比較はやっていません…。

練習問題2.4

ビットシフトしながらということなので、こんな感じでしょうか…。
PopCount()のみ書き出しています。他の部分は練習問題2.3と同じです。

練習問題2.5

x&(x-1) は最下位ビットをクリアする、という事実を使ってビット数を求める、ということで自身が無いですが、こんな感じで…
とりあえずは動いてます。

2.7 スコープ

宣言された変数などを参照できる範囲についての説明です。

ブロックは関数やループを囲んでいる {} で囲われた一連の文のことになります。
ブロック内で宣言された変数などはブロック外からは見えません。

具体的な例を出しながら説明されているので、実際に動かしながら見てみるとわかりやすいと思います。

ここでは練習問題はなし!わーいw

2章から結構ボリュームあるなぁ、読み応えあるなぁ、という印象です。
3章は基本データ型について。ここも結構ボリューミィな感じなので、がんばります。

なんとなく自宅学習しようと思って、丸善出版の『プログラミング言語Go』を買ってみました。
(正確には旦那様に買ってもらった、ですが)

せっかくなので、感想とか練習問題の解答とかを書いて行こうと思います。
最後まで続くといいですねぇ。。。

Goのインストールや開発環境の構築は終わっているものとして話を進めます。

ちなみに私は Atom エディタとターミナルで学習してます。

もくじ

1.1 ハロー、ワールド
1.2 コマンドライン引数
1.3 重複した行を見つける
1.4 GIFアニメーション
1.5 URLから取得
1.6 URLからの並列な取得
1.7 ウェブサーバ
1.8 残りの項目

1.1 ハロー、ワールド

ご存知、ハローワールド。
*書籍がカタカナで書いているので、それに習ってます。

以前旦那様がハローワークを見て、「あぁ、ハローワールドがあるんだねぇ」とつぶやいたくらい
エンジニア的にはお馴染みのワードですね。

細かいことはあとから説明があると思うので、とにかく本に書いてあるコードを写経します。

「Hello, 世界」って斬新だなぁ、とか思ったりもしますが、日本語版の書籍だからですかね。

そんなこんなで実行してみましょう。

このソースの動作確認をするには以下のコマンドを実行します。

Go言語はコンパイル言語なので、指定されたソースファイルをコンパイルして、ライブラリとリンクして、実行ファイルを生成して、それを実行する、というのを run は一度にやってくれるようです。

もちろんコンパイルとリンクをして実行ファイルを作る方法もあって、以下のコマンドを実行します。

そうすると同じディレクトリに「helloworld」というファイルが作られるので、これを実行するには

としてあげます。

run の場合も、build した実行ファイルから実行した場合も

と表示されるはずです。

Go言語は Unicode を扱うので、日本語も化けることなくきちんと表示されますねー。

この章は練習問題はないので次へ!

1.2 コマンドライン引数

この章ではコマンドライン引数の取り方のチュートリアルになっています。

コマンドライン引数は os.Args 取得できます。

os.Args は文字列のスライスです。
スライスはここでは動的に大きさを決めることができる配列だと思っておけばいいでしょう。

スライスの要素にアクセスするには、os.Args[0] と言ったようにJavaなどの他の言語と同じように添字を指定しればOKです。

0番目の要素にはコマンド自身の名前が入ってきて、それ以降の要素がコマンドライン引数になります。

まあ、、、スライスの説明はあとの章で詳しく出てくるようなので、ここではコマンドライン引数の取り方を覚えておけばいいと思います。

書籍に載っているソースコードはここで記載してもしょうがないと思うので、省略します。

というわけで練習問題の解答を…(間違ってても苦情は受け付けません…w)

練習問題1.1

コマンド名も表示されるようにするという問題なので、単純に for のカウンタを 0 からにしてみました。単純すぎ…?

練習問題1.2

個々の引数のインデックスと値を1行毎に表示する、ということなので、単純に fmt.Println() で index と arg を表示するように修正しました。
不要になったソースも削除しています。

練習問題1.3

ベンチマークテストをしろってことなのですが、必要となる知識はこのあとの説明になるのようなので、今回は飛ばします…

知識を得たら再度チャレンジするということにします(汗)

チュートリアルだからなのか、変数の定義の仕方とか、メソッドの使い方とか、そのへんはあまり言及されていないので、ちょっとわからなくなることがありますが、とりあえずいまのところは、そんなものなんだろう、程度にとどめて先に進めることにします。

1.3 重複した行を見つける

この節では、if文、for文、map、標準入力からの読み込みやファイル入出力などの使い方について説明されています。

C言語でお馴染みのfprintfに似た、Fprintfなんかも出てきて、書式指定子なども出てきます。
Go言語ではヴァーブ(verb)って呼ぶようですね。

詳しい説明は書籍を読んでもらうこととして、練習問題をやってみたいと思います。

練習問題1.4

ファイル読み込みで、重複した行のそれぞれが含まれていた全てのファイルの名前を表示するようにする。

私はファイル名の保存用にもう一つ map を追加して、行をキーとして、さらに map ファイル名を追加していく、という流れにしました。

最後にスラッシュ区切りでファイル名を並べた文字列を作成して、重複行と一緒に表示しています。

多重の map にしたので初期化の仕方で手間取ったりもしましたが、一応こんな感じでいいのかな、と…w

1.4 GIFアニメーション

この節ではGo言語の標準画像パッケージの基本的な使い方のチュートリアルになっています。

リサージュ図形というGIFアニメーションを作成するのですが、動いた時はちょっと感動しますw

ここでは、const宣言や構造体型なども出てきますが、詳しくはあとの章で出てくるので、ここではさらっとこんなものもあるという程度にど止めておくのがいいかと思います。

では、練習問題の解答を…

練習問題1.5

リサージュプログラムの背景を黒として、線を緑になるように修正する、というものです。

書籍にRGBでのカラーの作成方法は載っています。緑なので、#00FF00 で作っています。

paletteの0番目が背景色、1番目が線色なので、その順番に黒、緑と指定しています。

修正点はそこだけだったと思います。

練習問題1.6

リサージュプログラムを修正して、paletteに色をもっと追加して、複数の色で画像を生成しなさい、というものです。

paletteには赤、青、緑を追加しています。

SetColorIndex の代3引数を変更して、ということだったので、paletteの1〜3の色を使って順に色が変わるようにしてみました。

これでいいのかな…。

1.5 URLから取得

この節ではHTTPを使って情報を取得する簡単なチュートリアルになっています。

引数で渡されたURLからHTMLを取得する、といったものです。

http.Get(url)で取得できちゃうので、すごく簡単ですね。

というわけで、練習問題を…。

練習問題1.7

ioutil.ReadAll の代わりに io.Copy を使いなさい、というものです。

io.Copy の使い方とかいろいろ調べたりして時間がかかりましたが、問題をきちんと読んでからやれば簡単でした…。

基本的には ioutil.ReadAllio.Copy に置き換えただけなのですが、io.Copy の出力先を os.Stdout にしてあげればOKです。

エラーは取らないといけないので、戻り値は _, err にする必要があります。

練習問題1.8

コマンドライン引数で渡される url に http://がなければ追加する、というものです。

strings.HasPrefix が使えるというヒントが載っているので、そちらを使ってみます。

引数を取得したところで、http:// があるかないか判定をして、なければ追加するようにしています。

ハードコードしてますが、許してください…w

練習問題1.9

さて、最後の練習問題。この節は問題が多くて辛いですw

resp.Status に設定されている HTTP ステータスコードも表示するように、というものです。

何か問題の意味を履き違えているかもしませんが、とりあえず表示する処理を最後に追加しています。

1.6 URLからの並列な取得

ここでは並列プログラミングについてのチュートリアルになります。

Go言語の並列処理を行うゴルーチンとチャネルについて簡単に触れられていますが、詳しくはあとの章で説明されるようなので、ここではこんなふうに使えるんだ、くらいにとどめておくのがいいと思います。

練習問題1.10

fetchall プログラムの出力をファイルに保存するように修正しなさい、というものです。

特にヒントも書いていないので、file.Write を使ってみましたが、もっと簡単に書ける方法はないのかしら…。

これで一応、同じ内容が log.txt というファイルに保存されるようになります。

1.7 ウェブサーバ

簡単なウェブサーバの作り方のチュートリアルです。

なんか、すごく少ないコード量で動いてしまうので驚きました。

バックグランドでプログラムを起動させる方法が載っているので、以下のコマンドのように & を付けて起動します。

この後にサーバーを終了しないといけないの、その手順を。(旦那様には常識だって言われたけど…)

まず、起動時に以下のような数字が表示されます。これはプロセス番号になっています。

色々動かしたあとですでに起動時のログが見つからない、という場合は以下のコマンドを打ってください。

そうすると、現在起動されているプロセスの一覧が表示されます。

もっとたくさんあるかもしれませんが、一覧の中から自分が起動したアプリがあるはずなので、先頭に記載されている PID の部分がプロセス番号になります。

で、そのプロセス番号を使って、kill します。

これだけだとまだlocalhost:8000にアクセスできてしまうので、次のコマンドを打って、8000ポートを使っているプロセスを探します。

8000ポートを使っているプロセスの一覧が表示されます。

ここで main と書いてあるのが、今起動しているプログラムで、PID はプロセス番号になります。

なので、このプロセス番号を使って再度 kill します。

これでようやく全部のプロセスが終了するので、改めてプログラムを起動することができます。

が、、、面倒なので、バックグランドで起動させずに通常起動させて、Ctrl + C で終了させたほうがラクだと思います。

書籍では1.6 URLからの取得で作成した fetch プログラムと合わせて使うためにバックグランドで起動しているようですが、もうひとつターミナルを起動すればいいだけなので、通常起動のほうがなにかと便利かと思います。たぶん…。

練習問題1.12

文中でリエージュ図形と組み合わせるプログラムを書くのですが、それの修正になります。
リエージュ図形のソース部分は 1.4 GIFアニメーション で作ったものを流用しています。

パラメータを取得して、それを使ってリエージュ図形を変える、という感じです。

cyclesをパラメータで取得して、lissajous()に渡すように変更しました。

1.8 残りの項目

この節はswitch、名前付き型、ポインタ、メソッドとインタフェース、パッケージ、コメントについての簡単な説明になっています。

基本的には読み物で、ソースコードも記載されていますが、実際に書いて動かく必要はないかな、という感じです。

どれもこのあとの章で詳しく説明があると思うので、さらっと流してしまうのがいいでしょう。

この章は練習問題はないので、ここまで!

ようやくチュートリアルが終わりました…。地味に難しかったです、練習問題(汗)

さて、次は第2章 プログラム構造です。変数やパッケージ、スコープなどの説明が出てくるようです。

練習問題もちょくちょくあるようなので、がんばります…w

当たり前ですが細かい説明は書籍を読んでくださいね。