2.2 既存のデータ型を拡張する

型を定義する方法がわかった所で、intstringといった組み込み型、スライスやmap、チャネルなどの複合型を拡張して利用する方法を学びます。typeで型定義する場合、元になる型を基底型(underlying type)と呼びます。新しく型を作ることで、ベースとなる型の特性を引き継ぎながら、メソッドを追加して拡張できます。

「アプリケーションを作成する」作業を分割していくと、だいたい次の構成要素に分けられるでしょう。

  • 提供されている基本的なツール(標準ライブラリ、文法)を組み合わせる

  • ライブラリやフレームワークを使うためのグルー(糊づけ)コードを書く

Goは前者に比重があります。開発を経験しても特定のフレームワークの知識しか蓄積されないということも、大規模なフレームワークの中から呼び出される特定の処理を実装するだけということもなく、main()関数からプログラムの実行を追いかけることができ、汎用的に使える知識を身につけやすく、開発者を成長させる言語です。サードパーティーのフレームワークであっても、標準ライブラリの薄いラッパーであることが多く、標準ライブラリを学ぶインセンティブが高くなっています。

「標準に近いところでコードを書く」作業は、さまざまなレベルで行われていますが、ミクロなレベルでのテクニックとして、構造体を定義せずに既存の組み込み型を直接拡張する書き方があります。このような1つの要素に対して型定義を行ってメソッドを実装する手法は「Goらしい」コードだと言えるでしょう。

構造体についてはこの後に説明しますが、他のデータをラップした複合型を作って実装する手法は他の言語にもあります。たとえば構造体を作ってからメソッドを定義するときに構造体の要素が1つしかなかったとしたら、そのコードは、おそらくJava/Python/Rubyなどに慣れたプログラマーによって書かれたものだと推測できます。 ...