悩めるSEの雑記です

日々思いつくがままです

Go言語:チュートリアルと言語仕様 その1

ポツポツチュートリアルを写経しています。

go.dev

MySQLへのアクセスとRESTfulAPIの実装などやってみました。ふむ。用意されているライブラリ使うので、コード量はわずかでした。なんとなく雰囲気はわかったかな。

RESTful API実装では、curlコマンドでGETおよびPOSTして動作確認するんですがWindows版では動作が異なり、すっかりハマってしまいました。これはWindowsコマンドライン仕様によるものでしょう。区切り文字とエスケープ問題ですね。ずっと理由が分からず、GinのJSONエンコード処理のソースを何度も追いかける羽目になりました。

ちなみにVSCodeデバッグしたのは初めてでした。いや便利になりましたね。VSCodeを使うのは2~3年ぶりで、前に使ったときはJava&JSP開発のコーディングだけで、あまり便利な機能を使うこともなかったです。ツール類は情報収集しておかないとダメですね。

デバッグ時にライブラリソースを追いかけることがあります。そのときにいつも思うんですが、業務で作るようなモノと全く違うんですよね。抽象化されてるというか、”ライブラリ”という位置づけも関係しているのでしょうね。普段自分が作るものとのギャップの大きさに、少し自信をなくすこともあります。でもまあ、業務でこんなコードを書くことはないし、必要性もないのかな。今のプロジェクトのソースはC++ですが、結構複雑なクラス構成でした。自身が昔関わったプロジェクト、前職の社長と若いときに設計したものですが、それも後から見ると、なかなかコッテリとした印象でした。

コッテリって?昔データ構造+アルゴリズム=プログラムという表現がありました。当時のコードは、まず、データ構造への意識が強かった気がします。OOPでも当然ながらデータ構造としての面にも着眼はします。でも責務、役割といった面に重きをおいたモデル設計になってきたと思います。ああ、これは業務システムのプロジェクトをやることが多くなってきたからかな。データ構造に関するものはライブラリとして用意されているし・・自分がそういったものから離れていってしまっていたのですね。少し寂しい気持ちになりました。

レガシープロダクトでのスパゲティソース体験もあって、自分はわかり易さを意識してきました。直近プロジェクトでは、WEBフレームワークをゼロから作りました。今思うと・・よく頑張ったなと思う反面、特に凝ったところもなく、言語機能をフル活用することもなく、見方によれば”普通”でした。プログラムは子供ころからやっていたことも合って、好き、得意と思っていましたが、どこか置いていかれているような気持ちもあります。作るプロダクトで望まれるものも違うので比較する意味はありませんが。(車輪の再発明って言われそうですが、マイグレーション元アプリのサーバーサイドコードをそのまま流用するためと、何時メンテが終了するか分からないオープンソースをつかいたくなかったからです)

Go言語ってシンプルということが特徴としてよく語られています。シンプルで変わった機能もないから、誰が作っても同じようなものになる、そういう話もよくあります。これまで自分がやってきたプログラミングの価値観と近い気もしました。それも合って私は好きになれそうです。あ、ライブライの話とは矛盾しますね。当然ながらGo言語でもどう設計するかで全く違うものにはなります。

 

だいぶ話がそれて長くなりました。戻りましょう。ライブラリのソースを読んだ際に、関数定義の書式で?となる部分がありました。そこで言語仕様も少し読んでみました。冒頭のリテラルとかそんなところと、気になっていた関数のところです。?ってなっていたのはクラスメソッドを定義する場合の書式であることに、ふと気づきました。そこで言語仕様を class で検索したのですが・・・該当しない。ココで気付いたんですが、Go言語にはクラスが無いんですね。オブジェクト指向言語だと認識していたものですから、当然クラスという物があると思っていました。???Go言語はオブジェクト指向何でしょうか????Bardさんに尋ねてみよう。

Go 言語はオブジェクト指向プログラミング言語ですが、他のオブジェクト指向プログラミング言語ほどオブジェクト指向ではありません。 Go 言語にはクラスがなく、データとコードは構造体とメソッドによって組み合わせられます。 Go 言語には、オブジェクト指向プログラミング言語によく見られる継承や多態性などの機能もいくつかありません。
ただし、Go 言語には、オブジェクト指向プログラミングに役立ついくつかの機能があります。たとえば、Go 言語はメソッドをサポートしており、メソッドは構造体またはインターフェイスに関連付けられた関数です。メソッドは、レシーバー型のインスタンス上で呼び出すことができます。 Go 言語はまた、インターフェイスをサポートしており、インターフェイスはメソッドのコレクションです。インターフェイスは、型がインターフェイスで定義されたすべてのメソッドを実装しているかどうかを確認するために使用できます。

なるほど、なるほど。自分の想像するものと違っていて面白いですね。classはなくても同じような事ができるので、そこはあまり重要ではないです。

 

また話がそれました。チュートリアルと言語仕様学習をぼちぼちやっていきます。ある程度学習ができれば、軽いWEBアプリと、既存ライブラリに頼らず低レベルの実装からで何か作ってみたいです。

あ、単体テストツールもあるのかな?その辺りも調べてみたいです。