2023/08/24

ハッシュテーブルの実装やろうとしてる。

いろいろ調べてるときにtypes/typeutilパッケージをみつけた。
ChatGPT曰く

types/typeutilはGoのgolang.org/x/toolsリポジトリ内にあるパッケージで、型情報のユーティリティ関数やデータ構造を提供しています。このパッケージは、Goのソースコードの静的解析を行う際に役立つツールやライブラリで使用されることが多いです。 types/typeutilパッケージの主なコンポーネントには以下のようなものがあります:

  1. Map: 型をキーとして使用できるマップを提供します。Goの組み込みのマップでは、インターフェースや関数などの一部の型をキーとして使用することができませんが、typeutil.Mapを使用すると、これらの型もキーとして使用することができます。
  2. MethodSet: 与えられた型のメソッドセットを効率的に計算します。これは、インターフェースの満足チェックや型のメソッドの探索に役立ちます。
  3. Visit: 型の構造を再帰的に訪問するためのヘルパー関数を提供します。これは、複雑な型の構造を解析する際に役立ちます。 types/typeutilパッケージは、Goのソースコードの静的解析やリファクタリングツールの開発に役立つユーティリティを提供しています。このパッケージを直接使用することは少ないかもしれませんが、Goのソースコードの解析や変換を行うツールの開発には非常に役立ちます。

MapはbuiltinのmapとちがってChain法でつくってるっぽい。SetHasherしないとセットされる標準のhasherだと型情報によってハッシュ関数を切り替える作りになっているっぽい。
ただ、builtinのmapをラップした構造体なのでリサイズとかはmapにお任せ。mapのキーをhasherで計算したハッシュ値を使っていてそのおかげで元のmapで扱えない型でもキーとして使えるようになっている。
starlark-goの内部のhashtableも同じ感じになっているので型ごとに切り替えるやり方を踏襲しよう。