Golang(Go言語)は懐かしくて馴染むプログラミング言語

Profile image of Takashi Hanamura
花村貴史 / Takashi Hanamura 2022/06/16
Eye catching image for this article

僕は note で写真素材を販売していて、写真データをサーバーに公開するときの一連作業を自動化するべく Python スクリプトを書きました。

▶︎ https://github.com/nnamm/pyPhotoMaterials

長いこと使ってきて機能としては満足していますが、新しい風を起こしたいな〜ということで、学習も兼ねて Golang ( Go 言語)で書きなおすことにしました。

▶︎ https://github.com/nnamm/go-photo-materials

機能的には満たせているものの、Testing package によるテストの練習や CLI としてビルドするのはこれからです。

いったん作りきれましたので、開発を通して Golang に感じたことをお伝えします。

Golang は懐かしくて馴染む

「非常に懐かしい感じがあり、非常に馴染める言語」ってことです。僕、かなり好きかもしれません。 作り方や考え方が懐かしいんですよ。

・・・のお話をするために過去を振り返ります。

8 年間のアセンブラ経験

僕は 2000 年から 8 年間、JAL 国際線のシステム開発をしていました。

開発環境は TPF という IBM のメインフレーム用の OS で、OS 上の z/TPF だったか z/VM だったかの中でアセンブラを使っていました。デバッグするときはもちろん 16 進数の世界です。

アセンブラは人にはやさしくない言語ですが、IF 文や WHILE 文なんかも書けたので、ちょっとは人にやさしいものでした(笑)覚える命令は 30 個くらいしかなく( Golang も同じですよね)シンプルではあります。扱いは難しかったですが。

数年後、C 言語による開発環境も整備されて試験的に使ったこともあります。

その甲斐あって、レジスタ、メモリとその管理、ポインタという概念なんかが自然と身につきましたね。(ポインタ、難しくないですよ)

反面、オブジェクト指向な高級言語に最初は馴染めませんでした。お作法を知らなかったこともありますが、中でどんな処理が行われているか分からず、イメージができなかったからです。

というバックボーンが僕にはあります。

すると、Golang で書いているとなんだか懐かしい感覚になるんです。

Golang の 3 つの懐かしいところ

1. ありそうなことでも実現するには組みあげる

現代の言語なら「〜〜な処理がしたい」と考えたとき、大抵はライブラリが整っていたりすることが多いでしょう。また、print("hogehoge")とすれば標準出力にhogehogeと表示されますよね。

でも、TPF では表示するだけでひと手間かかりました。旅客データを取得するにも手続きが多く、めんどくさかったです。

のちに TPFDF という CRUD の操作が楽にできるものを使いまくってました。

こういう点が Golang と似ているなと感じます。

Golang は「言語のコアをシンプルに、何かを実現するときはそのシンプルな機能を組み合わせて実現しよう」というのがコンセプトです。

たとえば FTP。

Python なら標準の ftplib がありますが Golang にはありません。「FTP したけりゃ、RFC を読んで自ら仕組みを構築するよろし」の世界です(笑)

「マジか」とびっくりしたものの、おかげで RFC というもので規定されていることや、接続を確立するまでに色々やっていること( handshake がどーたらこーたら)なんかを知るきっかけになりましたね。

世の FTP アプリのありがさが身に沁みます。

とはいえ、FTP を自作していたらいつまでもゴールには到達できないので、今回は jlaffaye/ftp を使わせていただきました。

▶︎ https://github.com/jlaffaye/ftp

2022 年 6 月現在、FTPS を実現しようとするとエラーとなるため、FTP 接続しています

2. エラーハンドリング

Golang はあらゆるところでerr != nilを書きます。めっちゃ書きます。

 // os.Crateのエラーハンドリング
 f, err := os.Create("foo.txt")
 if err != nil {
     log.Fatalln(err)
 }
 // 遅延実行によるClose()のエラーハンドリング
 defer func(f *os.File) {
     err = f.Close()
     if err != nil {
         log.Fatalln(err)
     }
 }(f)

現代の言語ではtry〜catchなんかで書くものでしょう。人によっては「めんどくさっ」と感じる方もいらっしゃるかもしれませんね。

ところが、これまた懐かしいんですよ(笑)

前述の TPFDF を使っていたときなんかまさに ↑ こんなふうでしたもの。データ的・システム的なエラーが発生することを考慮し、エラーハンドリングしていました。単体テストめんどくさかったです。

Golang も同様にしつこいくらいやる文化ですね。

いや〜懐かしい!

3. オブジェクト指向ではないけど「風」に書ける

Golang はオブジェクト指向プログラミング( OOP )ではありません。構造体やインターフェースを使えばそれっぽく書けますので、データとメソッドの結びつきがわかるっちゃわかります。

Python を使ってきましたが、僕が OOP 的に組めているかというとまだ練習は必要でしょう(そこまで意識することはないでょうけどね)。

そんな自己評価のところ、Golang で書くと思考が楽だなぁと感じてしまうあたり、8 年間で培ったアセンブラ=手続き型は、良くも悪くも僕の基礎を形作っていると感じますね。

Golang を使いこなすのはこれから

懐かしいけれど使いこなせるようになるにはまだまだこれからです。

でも何だか楽しいです。

アセンブラ時代にそれとなく入ってきた知識が、現代の CPU や OS、メモリ管理などの仕組みと(厳密には違うかもしれませんが)「同じように考えられるじゃん=イメージできるなら作れるじゃん」と腑に落ちましたし、そういう細かい内部的なことへの知識欲が膨れ上がりましたね。

おわりに

Golang は「構造体やインターフェースを使いこなしてなんぼ」という印象です。正直、2 週間程度ではここらへんの理解は浅いですね。Golang らしい書き方も知らないことが多いです。とても重要そうな io.Reader/io.Writer の仕組みも知っておきたい。

それらは Web や書籍などから他者のコードを読んで慣らしていければいいでしょう。

一気にすべてを知ることはできません。
ひとつひとつ知りながら経験していけばいいのです。

そのためにはまず何でもいいから作りきることが大切ですね。続けた結果、積み上がったものが経験になりますから。

※掲載した写真は東福寺周辺を SIGMA fp + NOKTON 40mm F1.2 Aspherical にて撮影

CLI 開発中に参考にしたものリスト