前付けおよび後付け
訳者まえがき
2016年の夏頃のことでした。翻訳の候補にあがっていたGo言語の本について調べている途中で、訳者はとても懐かしい単語に出会いました。CSP(Communicating Sequential Processes)です。
さかのぼること○十年、訳者は修士論文に取り組んでいました。当時の専攻はソフトウェア工学。「(来たるべきマルチプロセッサ時代に対応した)書きやすく、わかりやすいプログラムを作るにはどのようなプログラミング言語がよいのか」を一所懸命考える日々を送っていました。SIMULA、CLU、コルーチン、オブジェクト指向……などといった単語の周辺をさまよって、最終的にCSPを修士論文のメイントピックに選んだのでした。以来ほとんどお目にかかったことがなかったこの単語が、比較的新しい言語の並行処理機能のベースになっていることを知ったのです。
「ウァ、CSPはまだ生き残ってたんだ!」
「温故知新」か「先祖返り」か。新しもの好きのIT業界において、Goは少し珍しい立ち位置にいる言語のような気がします。CSP以外にも、定数の定義に使われる「iota」はCSPと同じくらいの歴史をもつ言語であるAPLからアイデアを借りたものだそうですし、ガベージコレクションの手法も同じくらいの年代に提案されたものだそうです。こうした選択には「古かろうが、新しかろうが、いいものはいいのだ」というGo言語開発チームの主張が感じられます。
さて、訳者はその後就職したソフトウェア会社で出会った機械翻訳の面白さに魅了され、プログラミング言語自体の研究とはお別れし、ずっとプログラミング言語をもっぱら「使う側」に回っていました。途中からは、プログラミング言語などの本の人間翻訳や執筆をしたり、プログラミングの講座を開いたりもするようになりました。
使ったり教えたりする側からすると、これまでのプログラミング言語の「進化」の過程にはいろいろと文句をつけたくなります。
- 数が多すぎる! いったい、いくつ覚えればいいんだ!
- バージョンアップで前のプログラムが動かなくなるなんて信じられない! プログラムはあくまでもやりたい仕事をするための道具だ。本質でないことに時間をとられたくないぞ
- かっこよさげな、めったに使われないような(使わなくても他の機能で代替できる)機能や概念を(簡単に)追加しすぎ! 特に経験の浅いプログラマーには難しすぎる。自分で理解するのも大変だし、教えるのはもっと大変
プログラミング言語の数が増えるのはGo言語の開発者にはどうしようもできませんが、上にあげた2.と3.については、Go言語はかなりしっかりと対応してくれているように思います。Go言語の長所をすでにご存じの方も多いでしょうから、詳しくは書きませんが、訳者はGo言語の次のような点が特に気に入っています。
- C言語のように高速に動作するが、インタプリタ言語のように即座に実行することもできる
- バージョンアップで以前のコードが動かなくなることは(基本的には)ない
- むやみに新機能を追加せずに、初心者プログラマーのことも考えて開発され、機能追加してくれている
- テストが簡単にできる(15章だけを読んでも概要がわかります)
- クロスコンパイルが容易。たとえばLinuxウェブサーバー用のプログラムを、macOSで簡単に作れる。ビルドしたファイルをコピーするだけでよい(11章参照)
- 並行処理のモデルがわかりやすい(CSPをベースにしているので当然!)
この本『初めてのGo言語 第2版——他言語プログラマーのためのイディオマティックGo実践ガイド』は、このような優れた特徴をもつGo言語の全体像をていねいに解説してくれています。初版でも十分ていねいだったと思うのですが、著者は140ページも追加して、より細かな点に気を配った解説にしてくれたほか、ツール関連の情報をひとつの章にまとめて補強してくれたり、各章の最後に練習問題を用意したりしてくれました。
なお、原著にはコードの一部だけがリストされて動作するバージョンが掲載されていない例がありましたが、全体のコードがあったほうが便利でしょうから、訳者ができる限り作ってみました。
Go言語との浅からぬ縁を感じる訳者は、皆さんのお役に立てればと思い、付録Aに、原著の内容をベースにしてGo言語のまとめを書いてみました。また、付録Bに少し長めのプログラム例を書きました。訳者自身、この付録Aと付録Bを見ながらコードを書くようにして、不足部分を追加していきましたので、読者の皆さんのお役にも立つのではないかと思います。原著の最初のほうの章には、まとまったコードが書かれていないので、先に付録Bに目を通しておいていただくと、Goの世界に早めに馴染めるかもしれません。
最後になりましたが、いつもお世話になっているオライリー・ジャパンの皆様、そしてこの本を含め、訳者の関わった本をお読みいただいている皆様に深く感謝いたします。
2025年6月
マーリンアームズ株式会社 武舎 広幸
賞賛の声(第2版)
本書の初版も、Go言語に興味のある開発者にとって素晴らしい入門書だったが、第2版はさらによくなった。細かな点まできちんと説明されているにもかかわらず、ストーリーをもっている。Goのエコシステムを初めて知る人に最適だ。
—— Jonathan Hall Go言語開発者/コンテンツクリエイター
本書は単にGoの構文を教えてくれるだけでなく、Goをどう使うのがよいのかを教えてくれる。他言語に精通している開発者が、Go言語を学ぶのに最適な本だ。
—— Chris Hines Comcast シニアソフトウェアエンジニア
第2版を読み終え、この本の価値を改めて実感しました。特に、Go言語の根幹をなす並行処理や、近年重要性が増しているコンテキストといった、多くの学習者がつまずきやすい概念が、初版よりもわかりやすく、丁寧に解説されています。また、プログラミングにおいて避けては通れないポインタの章も、その詳細かつ実践的な解説はまさに必読と言えるでしょう。Go言語を学ぶすべての人に、この第2版を推薦します。
—— morimoli Webエンジニア
賞賛の声(初版)
Goはユニークな言語で、経験豊富なプログラマーでさえ、いくつかのことを学び直し、ソフトウェアについて従来とは違った考え方をする必要がある。本書は、イディオム的なコード、落とし穴、デザインパターンを指摘しながら、この言語の特徴をうまく紹介している。
—— Aaron Schlesinger Microsoft、シニアエンジニア
Jonは長年にわたってGoコミュニティにおける主要な発言者のひとりであり、Jonの講演や記事は我々にとっての重要な情報源であり続けてきた。本書はGoを学ぶための「プログラマーズガイド」だ。他言語でよく理解されている概念を蒸し返すことなく知るべきことをほどよく解説するという、バランスの取れた素晴らしい仕事を成し遂げてくれた。
—— Steve Francia Google、Go言語プロダクトリード。Hugo、Cobra、Viperの作者
JonはGo言語を知り尽くしている。明快で生き生きとした文章で、基本概念からリフレクションやCのコードの利用といった高度なトピックまで教えてくれる。また、Goのイディオム的なコードの書き方を、明快さと簡潔さを重視し、多くの例を通して示してくれている。さらには、ポインタのメモリレイアウトやガベージコレクションへの影響など、プログラムの動作に影響を与える基礎的な概念についてもていねいに説明してくれている。本書を読めば、初心者はGoを使いこなせるようになるだろうし、経験豊富なGoプログラマーでも、何かしら得るところがあるはずだ。
—— Jonathan Amsterdam Google、Go言語担当ソフトウェアエンジニア
本書はプログラミング言語Goの特徴、Goを強力なものにしてくれるデザインパターンや「イディオム」について紹介する必須の入門書だ。Jon Bodnerは、Go言語の基礎とその哲学をうまく結びつけて、読者を言語の開発者が意図したとおりのコードに導いてくれる。
—— Robert Liebowitz Morning Consult、ソフトウェアエンジニア
JonはGo言語の単なる参考書ではなく、この言語をイディオム的かつ実践的に理解するための本を書いてくれた。Jonのこの業界における経験が本書の原動力であり、この言語によって迅速な生産性の向上を考えている人の助けになるだろう。
—— William Kennedy Ardan Labs、マネージングパートナー
原著者まえがき
この本の初版の「まえがき」で筆者は次のように書きました。
最初に考えたこの本のタイトルは『Boring Go』でした。実のところGoのコードは退屈なのです。(中略)
退屈だからといって価値がないわけではありません。Go言語をうまく使いこなすためには、さまざまな機能をどのように組み合わせればうまくいくのかを理解しておく必要があります。GoのコードをJavaやPythonと同じように書くこともできますが、その結果は満足できるものとはならないでしょう。「何でこんなことになるんだ」と首を傾げてしまうかもしれません。そこでこの本の登場です。Go言語の機能をひと通り紹介しながら、「イディオム的なコード」をどのように書けばよいのかを説明していきます。
Goは依然として小さな言語で、機能も多くはありません。継承、アスペクト指向プログラミング、関数や演算子のオーバーローディング、パターンマッチ、名前付きパラメータ、例外など、ほかの言語にある多くの機能が含まれていません。では、なぜ退屈な言語の本を改訂する必要があるのでしょうか。
今回の改訂にはいくつかの理由があります。まず第1の理由です。「つまらない」というのは「単純」という意味ではありませんし、「不変である」という意味でもありません。過去3年間で、新しい機能、ツール、ライブラリが登場しました。構造化ロギング、ファジング、ワークスペース、脆弱性チェックなどの改善は、信頼性が高く、長続きし、保守可能なコードをGo開発者が作成するのに役立ちます。Go開発者がジェネリクスの経験を数年積んだ今、標準ライブラリには型制約とジェネリック関数が含まれるようになり、コードの繰り返しを避けられるようになりました。unsafeパッケージも、もう少し安全(safe)になるように更新されました。Goの開発者は、こうした新機能の「賢い使い方」を解説してくれる資料が求められています。
第2の理由は、初版ではGo言語のいくつかの側面について若干説明が不足していました。入門の章は筆者の理想からするとスムーズさに欠けていました。豊富なGoツールのエコシステムについても表面的な解説にとどまっていました。また、初版の読者からは「練習問題が欲しい」「サンプルコードをもう少し追加してほしい」という要望が寄せられましたので、そういった要望に応えました。
最後に、Go言語の開発チームが新しい機能を導入しました。長期的なソフトウェアエンジニアリング関連プロジェクトに必要な後方互換性を維持しながら、長年の設計上の欠陥に対処するために後方互換性を破る変更を導入する能力をGoに提供する戦略が登場したのです。Go 1.22で導入されたforループの変数スコープの新しい規則は、このアプローチを採用した最初の機能です。
Go言語は相変わらず退屈ではありますが、相変わらず素晴らしい言語です。前のバージョンよりもさらに素晴らしくなりました。読者の皆さんに、この第2版が歓迎されることを期待しています。
謝辞(第2版)
『初めてのGo言語』の初版に対する反響には驚きました。それと同時に、身の引き締まる思いでもあります。
執筆を開始したのは2019年の秋頃、2020年末に完成し、2021年初頭に書店の店頭に並びました。そう意図したわけではないのですが、この本の執筆が私の「パンデミックプロジェクト」になりました。誰かさんがパンを焼くのに夢中になっていた頃、私は「ポインタ」をどう説明しようか四苦八苦していたのです。
初版がなんとか世に出たところで、知人に会うと、よくこんな会話になりました。
「次はどんな本書くの?」
「しばらく休んでから、恋愛小説でも書くよ」
でも、「海賊と王女の物語」を書き始める前に、驚くべきことが起こりました。『初めてのGo言語』が大成功を収めたのです。「O'Reilly Learning」のベストセラーランキングで1年近くトップ5に入っていました。そうこうしているうちに、いくつか修正したい点が出てきました。また、読者から誤りの指摘や追加依頼の連絡も届くようになりました。一部は、増刷時に修正できましたが、O'Reilly Mediaの方に「第2版はどうでしょう?」とお尋ねしてみると、前向きな返事がいただけました。
第2版のために『初めてのGo言語』とオライリーの世界に戻ったのは心地よい体験でした。Rita Fernando氏は担当編集者として進行役を務めてくださいました。Jonathan Amsterdam、Leam Hall、Katie Hockman、Thomas Hunter、Max Horstmann、Natalie Pistunovichの各氏からいただいたフィードバックにより、この本が一段上のレベルに仕上がったように思います。また、Chris Hines氏は非常に厳密なチェックをしてくださり、いくつか間違いを見つけ、またより明快なコード例を提案してくださいました。Abby Deng氏およびGo Book Club at Datadogのメンバーからの助言は、特にGoを初めて使う開発者の視点から見て、必要な記述を追加するのに役立ちました。こういった方々のフィードバックにより、筆者の原稿にあった間違いはだいぶ減らすことができたと思いますが、(もうあまりないとよいのですが)まだ残っていたとすれば、すべて筆者の責任です。
妻と子供たちは、家族みんなで映画を見るはずの時間に、ひとり自室にこもって、Goの新機能を説明する最良の方法を考え出すことを許してくれました。
また、私に連絡をくださった初版の読者にも感謝したいと思います。皆さんのサポートと励ましが筆者の執筆の大きなエネルギーとなりました。
謝辞(初版)
本の執筆は孤独な作業だと思われがちですが、たくさんの方々の援助がなければできない仕事です。筆者はGopherCon 2019でCarmen Andoh氏に「Go言語に関する本を執筆したいのですが」とお伝えしたところ、O'Reilly MediaのZan McQuade氏を紹介してくださりました。McQuade氏は企画の段階から私をガイドしてくださりこの本の執筆中もさまざまなアドバイスをくださいました。Michele Cronin氏は担当編集者として、さまざまなフィードバックをくださり、何度か訪れた困難な時期にも私の話にじっくりと耳を傾けてくださいました。Tonya Trybula氏およびBeth Kelly氏は編集・校正作業でこの本の品質を上げてくださいました。
執筆の途中で数多くの方からフィードバック(および激励のお言葉)をお寄せいただきました。Jonathan Altman、Jonathan Amsterdam、Johnny Ray Austin、Chris Fauerbach、Chris Hines、Bill Kennedy、Tony Nelson、Phil Pearl、Liz Rice、Aaron Schlesinger、Chris Stout、Kapil Thangavelu、Claire Trivisonno、Volker Uhrig、Jeff Wendling、Kris Zaragozaの各氏を始めとする方々です。特にRob Liebowitz氏からは詳細なコメントと素早いレスポンスをいただき、この本をよりよいものにしてくださいました。
家族は、私が皆と過ごすはずの時間をコンピュータの前で過ごすのを許してくれました。特に、妻のローラは私が午前1時頃寝床に入るときでも、目を覚まされなかったふりをしてくれました。
最後に、40年ほど前にこの道に進むことを決断させてくれた2人の名前をあげさせていただきたいと思います。ひとり目は友人の父親であるPaul Goldstein氏です。Goldstein氏は1982年にCommodore PETを見せてくれ、「PRINT 2 + 2」と入力してEnterキーを押しました。画面に「4」が表示されたとき、私はビックリすると同時に、この機械に魅せられてしまったのです。Goldstein氏はプログラムの作り方を教えてくれただけでなく、この機械を2週間ほど貸してくれました。2人目は母です。私がプログラミングとコンピュータに興味をもったことに対して励ましてくれました。自分自身は、コンピュータが何であるのかまったく理解していなかったにもかかわらずです。Atari 2600用のBASICプログラミングのためのカートリッジを始め、VIC-20*1、続いてCommodore 64を買ってくれました。それにいつか自分のプログラムを書きたいと思っていた私にプログラミングの本も何冊か買ってくれました。
[*1] 訳注:日本での名称は「VIC-1001」。
私の夢を実現するのを助けてくださったことに対して深く感謝します。
対象読者
この本の対象読者は、2番目(あるいは5番目あたりかもしれませんが)にマスターするプログラミング言語を選ぼうとしているソフトウェア開発者です。Go言語を(あまり)使ったことがない人が主なターゲットです。Go言語について(そのマスコット以外)何も知らない人から、チュートリアルを読んだり、少しコードを書いてみたといった人までです。Go言語でのプログラムの書き方だけではありません。Go言語のプログラムを「イディオム的に」、つまりお勧めのスタイルに則って書く方法を紹介しています。ある程度の経験を積んだGo言語の開発者も、新しい機能をうまく活用するための方法を見つけられるでしょう。読者の皆さんが、Go言語のコードをGo言語のコードらしく書けるようになることがこの本の目標です。
Gitなどのバージョン管理システム(VCS)やIDEなど、開発者向けのツールの経験を仮定しています。また、並行性や抽象化などコンピュータサイエンスの基本的な概念に関する知識も仮定して、このような概念がGo言語でどのように処理されるかを説明します。例題のコードはGitHubからダウンロード可能ですし、多くの例はGo Playgroundを使って実行可能です。ネット接続は必須ではありませんが、例題によっては必要になる場合もあります。Go言語はHTTPサーバーの構築に使われることが多いので、HTTP関連の基本的な知識は前提とします。
Go言語の機能の多くは他の言語がもっているものですが、扱い方が異なるケースが多いためプログラムの構造は異なる場合が多いのです。この本ではまず開発環境の準備について説明し、続いて変数、型、制御構造、関数といった事柄を説明します。こういった事柄はスキップして先に進みたくなるかもしれませんが、少し我慢して内容を確認してください。Go言語のコードをイディオム的に書くためのヒントが含まれています。ちょっと見「明白」と思うことでも、よく考えるとビックリするようなこともあります。
著者紹介
Jon Bodner (ジョン・ボドナー)
25年以上のソフトウェア開発の経験をもち、教育、ファイナンス、eコマース、ヘルスケア、法律、行政、インターネットインフラなど多岐にわたる分野のシステム開発に携わってきた。
現在は、Datadogでスタッフエンジニアとして勤務し、顧客研修プログラムを通して顧客の知識や技能の改善に取り組んでいる。
以前は、Capital Oneで上級エンジニアとして、開発およびテスト用ワークフローの改善、ウェブ支払いページ検出法(特許取得)の開発、ソフトウェア開発関連の問題検出・管理用ツールの作成などの業務に従事してきた。
Go言語のカンファレンスで頻繁に講演を行っているほか、Go言語やソフトウェア工学に関する記事をブログで公開し、30万回以上アクセスされている。データアクセスライブラリProteus(https://github.com/jonbodner/proteus)の開発者であり、LGTMの派生プロジェクトであるchecks-out(https://github.com/capitalone/checks-out)の開発者でもある。
訳者紹介
武舎 広幸(むしゃ ひろゆき)
国際基督教大学、山梨大学大学院、米国オハイオ州立大学大学院、カーネギーメロン大学機械翻訳センター客員研究員等を経て、東京工業大学大学院博士後期課程修了。マーリンアームズ株式会社(https://www.marlin-arms.co.jp/)代表取締役。主に自然言語処理関連ソフトウェアの開発、コンピュータや自然科学関連の翻訳、辞書サイト(https://www.dictjuggler.net/)の運営などを手がける。独立行政法人情報処理推進機構(IPA)の「未踏ソフトウェア創造事業」に2年連続して採択された。著書に『実践 JavaScript!』(オーム社)、『BeOSプログラミング入門』(プレンティスホール出版。共著)『プログラミングは難しくない!』(チューリング)など、訳書に『初めてのJavaScript 第3版』『インタフェースデザインの心理学 第2版』『AIの心理学』(以上オライリー・ジャパン)、『Goプログラミング実践入門』『Python基礎&実践プログラミング』(以上インプレス)、『HTML入門 第2版』『Java言語入門』『Perl入門 第2版』(以上プレンティスホール)など多数がある。https://www.musha.com/にウェブページ。
査読者紹介(和書)
morimoli(もりもり)
法政大学経営学部卒。フリーランスWeb エンジニア。約20 年以上前に大手SIer に入社しWeb 開発を始めたが本業では一時中断。会社経営などブランクを挟み、縮小しながらもWeb 開発は継続。この本の訳者のJavaScript 講座受講をきっかけに、Web 技術の再学習をし、Web エンジニアに本格復帰。現在は、主にReact、NEXT.JS、Go 言語などを使ったWeb 開発を行っている。趣味はハッカソンに参加することと食べ歩き(焼肉・ラーメン)。https://github.com/mori-tt
マーリンアームズ