$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Goで関数の引数に、union型っぽくstruct Aもしくはstruct Bのどちらかを受け取れるようにしたい

Goで関数の引数に、struct Aという型もしくはstruct Bのどちらかを受け取るということをしたかった。interfaceをちゃんと切ってそれに必要なメソッドをAとBに実装することで実現できることを知った上で、あまり丁寧にそういうことをせずにやりたい。

色々調べると、genericsを使うとできるようだ。

package main

import "fmt"

type A struct {
    Field1 int
}

type B struct {
    Field2 string
}

type AorB interface {
    A | B
}

func PrintAorB[T AorB](s T) {
    // Tで受け取ったものをそのままs.(type)とは出来ないので、一旦anyへキャスト
    switch v := any(s).(type) {
    case A:
        fmt.Println(v.Field1)
    case B:
        fmt.Println(v.Field2)
    }
}

PrintAorB(A{Field1: 1})   // -> 1
PrintAorB(B{Field2: "2"}) // -> 2
// PrintAorB(2)           // -> type error

こんな感じにすることでAかBだけを受け付ける引数を実現できた。

またこのやり方で1つ便利に使えそうなユースケースとして、いろんなところで大量に使われている関数があったとして引数を新しい型に変更したい時に、いったん両方の型を受け付けた上で少しずつ変更していき、全部置き換わったら新しい型だけに変更するみたいな手法が取れそうに思った。もちろん関数自体を分けるという手もあるが、こういうやり方もあるんだなと覚えておく。

参考

本の内容が頭に入ってくるのは結局は知見まとめノートを作っている時

最近は読書のやり方を変えてみたら知識の吸収速度・引き出し速度が上がった話 - $shibayu36->blog;に書いているやり方で読書をしている。こういう流れだ。

  • (1)学びたいと思った知識が書いてありそうな本を2~5冊選ぶ
  • (2)1冊ずつざっくり読みながら、面白かった部分・気になった部分はKindleで黄色にハイライトしておく
  • (3)全冊読み終わったら、ハイライトした部分だけ眺めて、やっぱりおもしろいと思ったところは赤のハイライトを付け直す
  • (4)赤のハイライトを眺めて、読書ノートに転記する
  • (5)とくにおもしろい部分については、自分の知見まとめノートにカテゴリごとに整理する

しばらくこれを続けて感じたのは、結局のところ(4)〜(5)に至るまで書籍の内容が全然頭に入っていないということだ。(4)(5)の時に、はじめて「書いている内容が言いたかったのはこういうことだったのか」と頭が急に理解したり、「この知識は今の仕事のこの部分に役立ちそうだ」と急にアイデアが出たりする。読んでる段階でも自分では理解できていると感じているが、その段階だけで急に理解できたと感じる瞬間はあまりなく、振り返ってみるとまったく理解できてないことに気づく1

人によって理解のフレームワークはまったく異なると思うが、自分にとっては「自分の言葉でまとめる」というフェーズを経ないと理解ができないようだ。このフェーズを必ずやると読める冊数は少なくなってしまい知識をなかなか身につけられないと焦る気持ちもあるのだが、結局読んだとしてもあんまり頭に残ってなかったら意味ないので、今後も続けていこうと思う。


  1. ただし自分が経験上分かっているが言語化できていないことについては、読んだだけで理解できることがある

YAPC::Hiroshima 2024にクラスター株式会社としてスポンサー参加しました #yapcjapan

毎年恒例YAPCに行ってきました!いやー今回も楽しかったですね。いろんな種類の発表もあり、久しぶりの人や名前は知っているけど話したことない人ともたくさん関われました。スタッフの皆さん、こんな楽しいカンファレンスを開催してくれてありがとうございます。

発表としてはy_matsuwitterさんの「経営・意思・エンジニアリング」がもっとも印象に残っています。自分はエンジニアの立場でもちゃんと経営のことを知っておいた方が良いと思い、最近少しずつ学習しています。なぜなら知っておくことで自分の課題意識を自分の視点からだけでなく、経営に関わるメンバーのメリットを意識して伝えられ、その結果目線を合わせて改善に取り組めるからです。そういう気持ちがあったため、この発表の中で説明されていた経営の3つの変数と4つの制約の話は非常に参考になりました。

懇親会や二次会では、ar_tamaさんに着いて行ったらakiroomさん/川口さん/y_matsuwitterさんと話ができたり、zoncoenさんに誘ってもらって着いて行ったらupamuneさん/itkqさん/sugamasaoさんと話ができたりと、今まであまり話してこなかった人と関われたことが嬉しかったです。今回のYAPCでは今まで関わったことない人にもちゃんと話しかけようと思っていたため、その目標を達成できて良かったです。 他にも久々にはてな&はてなOBと話せたり、YAPCでよく会う人と再会したりと、いつも通りの同窓会的楽しさもありました。

また僕は企業スポンサーとして学生座談会に参加しました。学生の人が事前に質問を作ってくれていたのに答えていく形式でした。いくつかの回答についてはserimaさんがまとめてくれていました。ありがとうございます。 僕も学生時代に京都にGREEの藤本さんが来た会があり、そのきっかけではてなに入社できて人生変わったという経験がありました。僕も何か少しでも学生さんに役立つ答えを返せてたらいいなと感じています。 学生座談会では質問ビンゴでAmazonギフト券が当たるという催しだったのですが、そのギフト券は懇親会中に指定した企業に受け取りに行くという仕組みでした。この仕組みのおかげで自分のところに来た学生さんを、その人が興味を持った発表の発表者のところに連れていくことが出来ました。昔自分もYAPCで先輩エンジニアにPerlハッカーの集団のところに連れて行ってもらうみたいな良い経験を出来たので、同じようなことをサポート出来て良かったなと思います。

さらに本編翌日にはYAYAPC::Hiroshimaにも行ってきました。こちらも最高でした。何が最高かはルール上言えないのですが、これぞオフライン開催の醍醐味というイベントだったと思います。いろんな裏話には大事な知見が隠れてますね。あと有料イベントにしてくれていいんやで...

YAPCは毎回刺激をもらえて本当に楽しいです。スタッフの皆さん、毎年開催してくれてありがとうございます。来年開催されたらぜひ行きたいと思います!