B-Teck!

お仕事からゲームまで幅広く

【Go】Goに入門してる話

背景

何回か書いてるけど、1月から3ヶ月間業務上の都合でGoを書いている。
付け焼き刃でもいいからサラッと知識を入れる必要があり、色々調べたり聞いて回ったりした。
その記録をまとめておく

参照したもの

A Tour of Go

A Tour of Go
定番のやつ。
公式の用意したウォークスルーという感じだけどふわっとやってBasicsの途中で投げた気もする。
どこかで一度通して全部やりたい。

Udemyの講座

【Go入門】Golang(Go言語)基礎〜応用 + 各種ライブラリ+ webアプリ開発コース(CRUD処理) | Udemy
Udemyの年末セールで安くなってたので買ってみた。
A Tour of Goに比べて動画講座だと勝手に進んでくれるので、受動的に知識を入れるには良かった。
講座自体の質は、昨年末に投稿されたっぽい講座なのにgo.modの話とかが導入になかったりもするので、なんとも言えないところ。
可能なら自力で独学したほうが早いし質が良いと思う。

Software Design 1月号の特集

Software Design (ソフトウェアデザイン) 2021年1月号 (発売日2020年12月18日) | 雑誌/電子書籍/定期購読の予約はFujisan
Goについての結構わかりやすくて範囲の広い特集記事。
読んだ時点では結構わからない部分も多く、それなりに読み切るのが大変だった。
そのうちもう一周読んでみようと思う。

サーバーサイドGoについての知人の解説

サーバーサイドGo入門 #1 ~net/httpでサーバーを立てる~ - Prelude
サーバーサイドGo入門 #2 ~database/sqlでDBを扱う~ - Prelude
サーバーサイドGo入門 #3 ~gin, gormを使う~ - Prelude
サーバーサイドGo入門 #4 ~test~ - Prelude

Goを書くって話をしたら知人のGoヤクザが色々解説する記事を書いてくれた。
仕事の上で特に役に立ったのは前半だったけど、後半も自分で書くときの参考になった。

プログラミング言語Go完全入門

プログラミング言語Go完全入門 - Google スライド
メルペイの人が公開している勉強会の資料。
わかりやすかったが分量が多いのでこれも途中で挫折したりしながら少しずつ読んでる。

その他言語機能がわからなくて参考にした記事

Goでよく見るnewとNewを調べたときのメモ - Qiita
Goにおけるポインタの使いどころ
【Go】net/httpパッケージを読んでhttp.HandleFuncが実行される仕組み - Qiita
Go言語のperiod(.) importとblank(_) importについて - Qiita
Go言語でのダックタイピング
Goを学ぶときにつまずきやすいポイントFAQ
golangにおける独自エラー定義方法とエラーごとの処理分岐 - Qiita
Go言語: いろいろなマップの作り方まとめ - Qiita
Go/golangでの日付処理まとめ(チートシート) - Qiita
go-playground/validator リクエストパラメータ向けValidationパターンまとめ - Qiita

感想

Goは言語機能の自由度が高くない分、設計や思想をどう表現するかでかっこよさが出てくる言語だなぁと思ってる。
あと文法が平易なので、いきなり入っても数日で最低限の読み書きは出来るようになるところがいい。
エラーハンドリングは最初は煩わしく感じたけど、Javaの検査例外/非検査例外を考えながら書く実装よりよっぽどわかりやすくて良いなとなったりした。
案件の都合上並列・並行処理に全然触れていなかったり、テストを全然書けていなかったりするので、そのあたりをどうにかしたいところ。
一応3月一杯でGo書く仕事は終わっちゃうんだけど、個人でちょこちょこやっていきたいなと思う。

困ったときに id:TakumiKaribeid:jrywm121 が色々教えてくれるのでめちゃくちゃ助かりました。
今後も教えて下さい。

【Go】interfaceのダックタイピング難しかった

背景

最近Goに入門したんだけれど、JavaやKotlinなどを主に書いていた自分にとってGoのinterfaceはなかなかしっくり来なかったので調べた。

調べた内容

ダックタイピングとは

Rubyなどの動的型付け言語でよく用いられる型付けの作法。
ダック・タイピング - Wikipedia
もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである。 というのは確かにしっくり来る説明だと思う。

Goのinterfaceがなんでわからなかったか

JavaなどのInterfaceは、自身が基底の型のように扱われることでどのようなクラスであるかを表現する。
一方でGoのInterfaceは満たすべき振る舞いを定義し、その振る舞いを満たすかどうかで制約を表現する。
前者は 定義されるクラスが自分がなんの型の具象か を文脈とする一方で、後者は 利用したい構造体に期待される振る舞い を表す文脈のように思える。
どちらでもポリモーフィズムは表現出来るものの、思考の出発点と適用する対象が異なっているためにわからなかった…ような気がする。

なんとなくわかったのでコードを書いてみる

lifetime() が期待する Life の振る舞いを満たす Human を利用する例。

package main

import "fmt"

func main() {
    var human = Human{}
    lifetime(human)
}

func lifetime(l Life) {
    l.Birth()
    l.Die()
}

type Life interface {
    Birth()
    Die()
}

type Human struct {
}

func (h Human) Birth() {
    fmt.Println("うまれた")
}
func (h Human) Die() {
    fmt.Println("しにました")
}

感想

実装クラスがどのinterfaceに対応しているか明示している言語の方が安心感があるなと思ってしまった。
ダックタイピングの理屈はわかったけど、メリットはいまいち理解できずにいる。
うまくマッチする実装に出会ったら変わるのかなぁ。

参考資料

なぜGoはDuck typingを採用していると言えるのか、データ構造から詳しく解説してみた - Qiita
Go言語でのダックタイピング | MMM公式ブログ

【雑記】思考の限界になるとお粥のようなコンテンツしか摂取できなくなる

年が明けてから、従来の業務に加えてJavaのAPIをGo+Lambdaに移植するお仕事をしています。
GoもLambdaも未経験で何もわからんと思いながらやってますが、なんやかんやで3週間で12APIくらい移植できたので頑張ったなと思います。
昨年の年始と違って、フォローしてくれる仲間もいるし、不安や不満を聞いたり肯定している土壌もあり、わからないことを教えてくれる知人もいる状態なので、だいぶ健やかに過ごせています。

転職してからの経歴を思い返すと、

  • 別アプリケーションの画面と同じものを今触ってるシステムに作り直す×2
  • Java → KotlinのAPIサーバー作り直し×3
  • Groovy → KotlinのAPIサーバー作り直し
  • Java → Go + LambdaのAPIサーバー作り直し

と作り直すお仕事にばかり参画しています。不思議ですね。

まぁそんなのはいいんですけど、新しいことに没頭して摂取・学習している時期って、普段の思考や検討に使う脳の部位とは違う場所使いますよね。
なんというか、脳の今まで使ったこと無い部分を押し広げていくような…。
自分の思考の領域が拡張される感覚が楽しくて、ついつい限界までやってしまいがちです。

思考の限界に至ると積み上げ式の論理的な思考ができなくなってしまい、ポッドキャストを聞いても頭に入らない、小説を読んでも物語が脳内で組み立てられない、映画を見ても…となってしまいます。
こういう状況になると、優しい動物がじゃれるドキュメンタリー映像とか、日常系の山も落ちもない日常アニメ、キルミーベイベーみたいな緩い、お粥のようなコンテンツしか摂取できなくなりました。
だからどうという話でも無いんですが、こう、脳の思考が停止している感覚に自覚的になる経験ってあまりなかったので面白いなと思った体験でした。

昔はめちゃくちゃに頭使ってもこうなることも少なかったので、こういうのも加齢なんですかね…悲しい。