私が歌川です

@utgwkk が書いている

Kyoto.go #65 に参加した & 登壇した #kyotogo

Kyoto.go に参加しました。今回は会場提供を担当しました。

kyotogo.connpass.com

もともとは DynamoDB localのDescribeTable APIのレスポンスを補完するプロキシを書いた - 私が歌川です などでGoに関する発表ネタが貯まってきたのでそろそろやりたいな~と思い、Kyoto.go の運営メンバーの方にXでメンションしていたのですが、いろいろあり会場提供もやる形になりました。会場提供側として不慣れな点もあったと思うのですが、無事に開催できてよかったです。

ネタが貯まってきたといいつつ、Go 1.27で導入されるメソッドのジェネリクス対応のことが気になってきたので、当初予定していた内容から変えて発表しました。Goのジェネリクス導入以前・Go 1.18で導入されたジェネリクスとその限界・Go 1.27で導入予定のメソッドのジェネリクスで広がる可能性、という流れで過去・現在・未来の話をしました。

speakerdeck.com

Go 1.26までのジェネリクスでは、以下のコードのような独自型のメソッド定義に対して型引数を渡すことはできませんした (文法的には書けるがコンパイルエラーになる)。同等のことを実現するには、メソッドではなく関数を経由する必要がありました。Go 1.27からはこの制約が撤廃される予定です。

type List[T any] []T

func (l List[T]) Map[U any](f func(v T) U) List[U] {
  // snip
}

ただし、以下のようにinterfaceのメソッドをジェネリクスにすることは引き続きできません。

type Iface interface {
  Method[T any]() T
}

発表中では、メソッドのジェネリクス対応によってどのようなコードが書けるか、このように書けると夢が広がりそうだね、というトピックを中心に取り上げていました。発表後の雑談タイムで、*Rand 型のメソッドで乱数を生成するときに、整数の型をジェネリクスで指定できるようにするproposalがある、という話を聞いて、地に足の付いた・正当進化らしい用法についても知れてよかったです。発表すると知見を広められるだけではなく、知見を得ることもできるという感じですね。

github.com

雑談タイムのどこかで、リフレクションを使う実装を学ぶにあたって、どういうライブラリのコードを読むとよいか、という質問があったと思います。だいたいがstructのフィールドに対する操作だと思うので、まずは以下あたりから読むとよいと思います。github.com/caarlos0/envについては、ジェネリクスとリフレクションを組み合わせた実装もあります。


Goでツールを作った話やWASM、tsgo、登壇に向けた話など、いろいろ聞けてよかったです。身近に普段使っているプログラミング言語のコミュニティがあると何かと便利なので、今後も盛り上げていきたいですね。

時間のないサイト運営者リング